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 }
时间: 2024-10-14 07:26:56

Codeforces 622F The Sum of the k-th Powers(数论)的相关文章

Codeforces 622F The Sum of the k-th Powers

Discription There are well-known formulas: , , . Also mathematicians found similar formulas for higher degrees. Find the value of the sum  modulo 109?+?7 (so you should find the remainder after dividing the answer by the value 109?+?7). Input The onl

codeforces 622F. The Sum of the k-th Powers 拉格朗日插值法

题目链接 求sigma(i : 1 to n)i^k. 为了做这个题这两天真是补了不少数论, 之前连乘法逆元都不知道... 关于拉格朗日插值法, 我是看的这里http://www.guokr.com/post/456777/, 还挺有趣... 根据题目给出的例子我们可以发现, k次方的通项公式的最高次是k+1次, 根据拉格朗日插值法, 构建一个k+1次的方程需要k+2项. 然后公式是  , 对于这个题, p[i]就是i^k+(i-1)^k+(i-2)^k+.....+1^k, 这部分可以预处理出

Codeforces 622F The Sum of the k-th Powers ( 自然数幂和、拉格朗日插值法 )

题目链接 题意 : 就是让你求个自然数幂和.最高次可达 1e6 .求和上限是 1e9 分析 :  题目给出了最高次 k = 1.2.3 时候的自然数幂和求和公式 可以发现求和公式的最高次都是 k+1 那么大胆猜测幂为 k 的自然数幂和肯定可以由一个最高次为 k+1 的多项式表示 不会证明,事实也的确如此 此时就变成了一个拉格朗日插值的模板题了 只要先算出 k+2 个值.然后就能确定最高次为 k+1 的多项式 套模板求值即可 当然自然数幂和不止这一种做法.例如伯努利数.斯特林数等 详细可参考 ==

Codeforces 396B On Sum of Fractions 数论

题目链接:Codeforces 396B On Sum of Fractions 题解来自:http://blog.csdn.net/keshuai19940722/article/details/20076297 题目大意:给出一个n,ans = ∑(2≤i≤n)1/(v(i)*u(i)), v(i)为不大于i的最大素数,u(i)为大于i的最小素数, 求ans,输出以分式形式. 解题思路:一开始看到这道题1e9,暴力是不可能了,没什么思路,后来在纸上列了几项,突然想到高中时候求等差数列时候用到

Codeforces 396B On Sum of Fractions 规律题

题目链接:点击打开链接 我们把 1 / { u(i)*v(i) }拆开->  (1/(u(i)-v(i)) * ( 1/v(i) - 1/u(i) ) 若n +1  是素数,则显然(1/(u(i)-v(i)) * ( 1/v(i) - 1/u(i) ) 这样完全相同的式子有 u(i)-v(i) 个 那么就可以把前面系数约掉,那么剩下的式子就是 1/2 - 1/(n+1) 若不是,则我们找到第一个<=n的素数,即v(n) 和第一个>n的素数,即 u(n) 然后前面的 2-v(n)求和,即

Codeforces 963A Alternating Sum 【数论+数学】

官方题解这个样子我觉得说得比较清楚.Z我们可以朴素的预处理出来(注意乘法膜),q的话考点在于[分数取膜]即 (a/b)%P = a* inverse of b %P 这就涉及到算b的逆元,我用的是欧几里得算法.下面这个博客写的很清楚. http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 然后还有两个细节,一是要写快速幂这样才能 O(k * log(n)) 复杂度预处理出Z,快速幂的时候注意a的类型得是long lon

leetcode 862 shorest subarray with sum at least K

https://leetcode.com/problems/shortest-subarray-with-sum-at-least-k/ 首先回顾一下求max子数组的值的方法是:记录一个前缀min值,然后扫一遍sum数组. 1.首先这里不需要最大,因为刚好够k就好了 2.这里需要距离最短.就是数组的长度最短. 这里的思路也一样,不过保存很多个min值,就是用一个队列,保存前缀的min值,不需要最min,只不过有更小的就更好. 也就是如果sum数组的值是: ..... 60, 40.....Y..

862. Shortest Subarray with Sum at Least K

Return the length of the shortest, non-empty, contiguous subarray of A with sum at least K. If there is no non-empty subarray with sum at least K, return -1. Example 1: Input: A = [1], K = 1 Output: 1 Example 2: Input: A = [1,2], K = 4 Output: -1 Exa

[Swift]LeetCode862. 和至少为 K 的最短子数组 | Shortest Subarray with Sum at Least K

Return the length of the shortest, non-empty, contiguous subarray of A with sum at least K. If there is no non-empty subarray with sum at least K, return -1. Example 1: Input: A = [1], K = 1 Output: 1 Example 2: Input: A = [1,2], K = 4 Output: -1 Exa