Codeforces 622F The Sum of the k-th Powers(数论)

题目链接 The Sum of the k-th Powers

其实我也不懂为什么这么做的……看了无数题解觉得好厉害哇……

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 #define rep(i, a, b)    for (int i(a); i <= (b); ++i)
 6 #define dec(i, a, b)    for (int i(a); i >= (b); --i)
 7 
 8 const int mod = 1000000007;
 9 const int N   = 1000010;
10 
11 int v[N], p[N], f[N], r[N], b[N], c[N], d[N];
12 int n, m, ret, tmp, tot;
13 
14 inline int Pow(int a, int b){
15     int t = 1;
16     for (; b; b >>= 1, a = 1LL * a * a % mod)
17         if (b & 1) t = 1LL * t * a % mod;
18     return t;
19 }
20 
21 int main(){
22 
23     scanf("%d%d", &n, &m); ++m;
24 
25     f[1] = 1; 
26     rep(i, 2, m){
27         if (!v[i]){
28             f[i] = Pow(i, m - 1);
29             p[++tot] = i;
30         }
31 
32         rep(j, 1, tot){
33             if (i * p[j] > m) break;
34             v[i * p[j]] = 1;
35             f[i * p[j]] = 1LL * f[i] * f[p[j]] % mod;
36             if (i % p[j] == 0) break;
37         }
38     }
39 
40     rep(i, 2, m) (f[i] += f[i - 1]) %= mod;
41 
42     if ((n %= mod) <= m) return 0 * printf("%d\n", f[n]);
43 
44     r[0] = r[1] = 1;
45     rep(i, 2, m) r[i] = 1LL * (mod - r[mod % i]) * (mod / i) % mod;
46     rep(i, 2, m) r[i] = 1LL * r[i - 1] * r[i] % mod;
47     rep(i, 1, m + 1) b[i] = (n - i + 1 + mod) % mod;
48     
49     c[0] = d[m + 2] = 1;
50     rep(i, 1, m + 1) c[i] = 1LL * c[i - 1] * b[i] % mod;
51     dec(i, m + 1, 1) d[i] = 1LL * d[i + 1] * b[i] % mod;
52 
53     rep(i, 0, m){
54         tmp = 1LL * f[i] * r[m - i] % mod * r[i] % mod * c[i] % mod * d[i + 2] % mod;
55         if ((m - i) & 1) (ret += mod - tmp) %= mod;
56         else (ret += tmp) %= mod;
57     }
58 
59     return 0 * printf("%d\n", ret);
60 }

 

转载于:https://www.cnblogs.com/cxhscst2/p/6798469.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值