1 h 2 = 1 a 2 + 1 b 2 + 1 c 2 \cfrac{1}{h^2}=\cfrac{1}{a^2}+\cfrac{1}{b^2}+\cfrac{1}{c^2} h21=a21+b21+c21
E ( x + y ) = E ( x ) + E ( y ) E(x+y)=E(x)+E(y) E(x+y)=E(x)+E(y)
#include
using namespace std;
typedef long long ll;
const ll mod = 998244353;
const int N = 6e6 + 10;
int n;
ll qpow(ll a, ll b) {
a %= mod;
ll res = 1;
while (b) {
if (b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
ll f[N], sum[N];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
for (int i = 1, lim = 6e6; i <= lim; i++) {
f[i] = qpow(1ll * i * i, mod - 2);
sum[i] = (sum[i - 1] + f[i]) % mod;
}
int T;
cin >> T;
while (T--) {
cin >> n;
ll a = (qpow(n, mod - 2) * 3) % mod;
cout << ((a * sum[n]) % mod) << endl;
}
return 0;
}
Funny String
Boring Game
Expression
Array Repairing
Alice and Bob
Tree
Set2
经画图 和撕了N张纸 后发现,左右对折、上下对折之间的顺序没有任何关系,
假设左右对折了 x x x 次,上下对折了 y y y 次,最后横竖裁开,纸片个数 = ( 2 x + 1 ) ( 2 y + 1 ) =(2^x+1)(2^y+1) =(2x+1)(2y+1)
E ( x ) = ∑ x × p ( x ) = ∑ x = 0 n C n x ( 2 x + 1 ) ( 2 n − x + 1 ) 2 n E(x)=\sum x\times p(x)=\sum^n_{x=0} \cfrac{C^x_n(2^x+1)(2^{n-x}+1)}{2^n} E(x)=∑x×p(x)=x=0∑n2nCnx(2x+1)(2n−x+1)
其中分子部分
∑ x = 0 n C n x ( 2 x + 1 ) ( 2 n − x + 1 ) = ∑ x = 0 n C n x ( 2 n + 2 x + 2 n − x + 1 ) = 2 n ∑ x = 0 n C n x + ( ∑ x = 0 n C n x 2 x + ∑ x = 0 n C n x 2 n − x ) + ∑ x = 0 n C n x \sum^n_{x=0}C^x_n(2^x+1)(2^{n-x}+1)\\=\sum^n_{x=0}C^x_n(2^n+2^x+2^{n-x}+1)\\=2^n\sum^n_{x=0}C^x_n+(\sum^n_{x=0} C^x_n2^x+\sum^n_{x=0} C^x_n2^{n-x})+\sum^n_{x=0} C^x_n x=0∑nCnx(2x+1)(2n−x+1)=x=0∑nCnx(2n+2x+2n−x+1)=2nx=0∑nCnx+(x=0∑nCnx2x+x=0∑nCnx2n−x)+x=0∑nCnx
观察发现
∑ x = 0 n C n x 2 x = ∑ x = 0 n C n x 2 x × 1 n − x = ( 2 + 1 ) n = 3 n \sum^n_{x=0} C^x_n2^x=\sum^n_{x=0} C^x_n2^x\times 1^{n-x}=(2+1)^n=3^n x=0∑nCnx2x=x=0∑nCnx2x×1n−x=(2+1)n=3n
对,就是化成二项式,就是下面这个↓
( a + b ) n = ∑ k = 0 n C n k a k b n − k (a+b)^n=\sum^n_{k=0}C^k_na^kb^{n-k} (a+b)n=k=0∑nCnkakbn−k
当 a = 1 a=1 a=1 且 b = 1 b=1 b=1 时,
( 1 + 1 ) n = ∑ k = 0 n C n k 1 k 1 n − k = ∑ k = 0 n C n k = 2 n (1+1)^n=\sum^n_{k=0}C^k_n1^k1^{n-k}=\sum^n_{k=0}C^k_n=2^n (1+1)n=k=0∑nCnk1k1n−k=k=0∑nCnk=2n
然后回到本题,同理可得
∑ x = 0 n C n x 2 n − x = ∑ x = 0 n C n x 2 n − x × 1 x = ( 1 + 2 ) n = 3 n \sum^n_{x=0} C^x_n2^{n-x}=\sum^n_{x=0} C^x_n2^{n-x}\times 1^{x}=(1+2)^n=3^n x=0∑nCnx2n−x=x=0∑nCnx2n−x×1x=(1+2)n=3n
因此化简原来的公式可以得出
E ( x ) = 2 n + 1 + 2 × 3 n 2 n E(x)= 2^n+1+\cfrac{2\times3^n}{2^n} E(x)=2n+1+2n2×3n
记个和这题没什么关系的笔记:
裁纸数个数的时候发现,如果只有左右对折 or 上下对折时,记 a x a_x ax 为对折了 x x x 次后纸片的个数
有如下数列:
a 1 = 6 a_1=6 a1=6、 a 2 = 10 a_2=10 a2=10、 a 3 = 18 a_3=18 a3=18、 a 4 = 34 a_4=34 a4=34 …
a 2 − a 1 = 4 a_2-a_1=4 a2−a1=4、 a 3 − a 2 = 8 a_3-a_2=8 a3−a2=8、 a 4 − a 3 = 16 a_4-a_3=16 a4−a3=16…
求像这种公差为等比数列的通项公式,一般分为如下步骤:
以上面的数列为例,记
a n + 1 = a n + 2 n + 1 a_{n+1}=a_n+2^{n+1} an+1=an+2n+1
然后让等式左右两边都减去同一个数 x x x,
a n + 1 − x = a n + 2 n + 1 − x a_{n+1}-x=a_n+2^{n+1}-x an+1−x=an+2n+1−x
这个数是自己构造的,构造出来的目的是使等式左右两边相似,这里令 x = 2 n + 2 x=2^{n+2} x=2n+2
a n + 1 − 2 n + 2 = a n + 2 n + 1 − 2 n + 2 = a n + 2 n + 1 − 2 × 2 n + 1 = a n − 2 n + 1 a_{n+1}-2^{n+2}=a_n+2^{n+1}-2^{n+2}=a_n+2^{n+1}-2\times2^{n+1}=a_n-2^{n+1} an+1−2n+2=an+2n+1−2n+2=an+2n+1−2×2n+1=an−2n+1
发现 a n − 2 n + 1 a_n-2^{n+1} an−2n+1 是个公比 q = 1 q=1 q=1 的等比数列,
因此可以直接往前推
a n − 2 n + 1 = . . . = a 1 − 2 2 = 6 − 4 = 2 a_n-2^{n+1}=...=a_1-2^2=6-4=2 an−2n+1=...=a1−22=6−4=2
a n = 2 n + 1 + 2 a_n=2^{n+1}+2 an=2n+1+2
总结:若存在 a n + 1 = a n + b k a_{n+1}=a_n+b^k an+1=an+bk,则构造通项公式 a n − b k + 1 b − 1 a_n-\cfrac{b^{k+1}}{b-1} an−b−1bk+1
#include
using namespace std;
typedef long long ll;
ll n;
namespace MOD { // 取模运算板子
const ll mod = 998244353;
ll qpow(ll a, ll b) {
a %= mod;
ll res = 1;
while (b) {
if (b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
ll Mul(ll a, ll b) {
return (a * b) % mod;
}
ll Sub(ll a, ll b) {
return (a - b + mod) % mod;
}
ll Add(ll a, ll b) {
return (a + b) % mod;
}
}
using namespace MOD;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T;
cin >> T;
while (T--) {
cin >> n;
if (n == 0) cout << 4 << endl;
else if (n == 1) cout << 6 << endl;
else {
ll _2n = qpow(2, n);// 2^n
ll _3n = qpow(3, n); // 3^n
ll Inv_2n = qpow(_2n, mod - 2); // 1/2^n
ll res = Add(1, Add(_2n, Mul(Mul(2, _3n), Inv_2n)));
cout << res << endl;
}
}
return 0;
}
Function
Exam
Set1
An Easy Matrix Problem