题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6814
pown数组用于线性求逆元,需注意初始化,行号35
公式,行号37
理解不了,只能死记硬背了
参考文献:https://www.cnblogs.com/zjp-shadow/p/7773566.html
1 #include<iostream>
2 #include<algorithm>
3 #include<cstring>
4 #include<string>
5 #include<cstdio>
6
7 #define ll long long
8 using namespace std;
9
10 const int m = 998244353;
11 const int maxn = 6e6 + 10;
12
13 int n;
14 ll sum[maxn];
15 ll pown[maxn];
16
17 ll fast_pow(ll base,ll k)//base^k // long long - must
18 {
19 ll res = 1;
20 while(k){
21 if(k & 1){//奇偶
22 res *= base % m;
23 }
24 base *= base;
25 base %= m;res %= m;
26
27 k >>= 1;
28 }
29 return res % m;
30 }
31
32 int main(){
33 int T;scanf("%d",&T);
34 //pre_solve;
35 pown[1] = sum[1] = 1;//
36 for(int i = 2 ; i <= 6e6 ; i++){
37 pown[i] = (m - m / i) * pown[m % i] % m;//线性求逆元
38 //pown[i] = fast_pow(i % m, m - 2) % m;
39 sum[i] = (sum[i - 1] + pown[i] * pown[i] % m) % m;//可利用到pown数组结果
40 //sum[i] = (sum[i - 1] + fast_pow(i * i % m, m - 2)) % m ;//计算期望
41 }
42
43 while(T--){
44 scanf("%d",&n);
45 printf("%lld
",3 * sum[n] * pown[n] % m);
46 }
47 // 1/h^2 = 1/a^2 + 1/b^2 + 1/c^2 ; a,b,c [1,n]
48 // b/a % p = b*a^(p-2) % p 小费马定理
49
50 return 0;
51 }