BZOJ3601 一个人的数论

BZOJ3601 一个人的数论

题意

\[ ans = \sum _ {i \nmid n} i ^ d \]

\[ n = \prod _ {i = 1} ^ {w} p _ i ^ {\alpha _ i} \]

输入

第一行给出$d$, $w$

接下来$w$行,第$i + 1$行给出$p _ i$, $\alpha _ i$

输出

题目所求的$ans$

样例输入

3 2
2 1
5 1

样例输出

1100



围观大神题解:https://www.cnblogs.com/jianglangcaijin/p/4033399.html



 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 template <class _T> inline void read(_T &_x) {
 4     int _t; bool flag = false;
 5     while ((_t = getchar()) != ‘-‘ && (_t < ‘0‘ || _t > ‘9‘)) ;
 6     if (_t == ‘-‘) _t = getchar(), flag = true; _x = _t - ‘0‘;
 7     while ((_t = getchar()) >= ‘0‘ && _t <= ‘9‘) _x = _x * 10 + _t - ‘0‘;
 8     if (flag) _x = -_x;
 9 }
10 typedef long long LL;
11 const int maxw = 1010;
12 const int maxd = 110;
13 const int mod = 1e9 + 7;
14 inline int mul(int a, int b) {return (int)((LL)a * b % mod); }
15 inline int add(int a, int b) {
16     a += b;
17     if (a < 0) a += mod; if (a >= mod) a -= mod;
18     return a;
19 }
20 int qpow(LL a, LL b) {
21     if (b < 0) return qpow(qpow(a, mod - 2), -b);
22     LL ret = 1;
23     while (b) {
24         if (b & 1) (ret *= a) %= mod;
25         (a *= a) %= mod, b >>= 1;
26     }
27     return (int)ret;
28 }
29 int H(int i, int p, int a, int d) {
30     return mul(qpow(p, (LL)a * i), add(1, -qpow(p, d - i)));
31 }
32 int A[maxd][maxd], X[maxd];
33 inline void init(int d) {
34     static int sum[maxd];
35     sum[0] = 0;
36     for (int i = 1; i <= d + 2; ++i) {
37         sum[i] = add(sum[i - 1], qpow(i, d));
38         A[i - 1][d + 2] = sum[i], A[i - 1][0] = 1;
39         for (int j = 1; j <= d + 1; ++j) A[i - 1][j] = mul(A[i - 1][j - 1], i);
40     }
41     for (int i = 0, tmp; i <= d + 1; ++i) {
42         int to = i;
43         while (to <= d + 1 && !A[to][i]) break;
44         if (i != to) swap(A[i], A[to]);
45         for (int j = 0; j <= d + 1; ++j) if (j != i && A[j][i]) {
46            tmp = mul(A[j][i], qpow(A[i][i], mod - 2));
47            for (int k = 0; k <= d + 2; ++k) A[j][k] = add(A[j][k], -mul(tmp, A[i][k]));
48         }
49     }
50     for (int i = 0; i <= d + 1; ++i) {
51         X[i] = mul(A[i][d + 2], qpow(A[i][i], mod - 2));
52     }
53 }
54 int d, w, p[maxw], a[maxw];
55 int main() {
56     //freopen(".in", "r", stdin);
57     //freopen(".out", "w", stdout);
58     read(d), read(w);
59     for (int i = 1; i <= w; ++i) read(p[i]), read(a[i]);
60     init(d);
61     int ans = 0;
62     for (int i = 1; i <= d + 1; ++i) {
63         int ret = X[i];
64         for (int j = 1; j <= w; ++j)
65             ret = mul(ret, H(i, p[j], a[j], d));
66         ans = add(ans, ret);
67     }
68     cout << ans << endl;
69     return 0;
70 }

时间: 2024-11-05 12:19:32

BZOJ3601 一个人的数论的相关文章

[bzoj3601] 一个人的数论 [莫比乌斯反演+高斯消元]

题面 传送门 思路 这题妙啊 先把式子摆出来 $f_n(d)=\sum_{i=1}^n[gcd(i,n)==1]i^d$ 这个$gcd$看着碍眼,我们把它反演掉 $f_n(d)=\sum_{i=1}^n\sum_{j|i,j|n}\mu(j)i^d=\sum_{j|n}\mu(j)\sum_{i=1}^{\frac{n}{j}}(ij)^d=\sum_{j|n}\mu(j)j^d\sum_{i=1}^{\frac{n}{j}}i^d$ 那么最后面这个东西就是个自然数幂求和了 在这篇关于斯特林数的

省选之前的未完成的计划(截至到省选)

PLAN OF THE COMING HEOI good problems:-bzoj4823:[Cqoi2017]老C的方块 [*]-bzoj3171:[Tjoi2013]循环格 [*]-bzoj4200:[Noi2015]小园丁与老司机 [*]-bzoj1061:[Noi2008]志愿者招募 [*]-bzoj3600:没有人的算术 [*]-bzoj2806:[Ctsc2012]Cheat [*]-bzoj2219:数论之神 [*]-bzoj2595:[Wc2008]游览计划 [*]-bzoj

【bzoj3601】一个人的数论 莫比乌斯反演+高斯消元

题目描述 题解 莫比乌斯反演+高斯消元 (前方高能:所有题目中给出的幂次d,公式里为了防止混淆,均使用了k代替) #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const ll mod = 1000000007; ll a[110][110] , p[1010] , v[1010]; ll pow(ll x , ll

【bzoj3601】一个人的数论(莫比乌斯反演+拉格朗日插值)

传送门 题意: 求\[ \sum_{i=1}^{n}i^d[gcd(i,n)=1] \] 思路: 我们对上面的式子进行变换,有: \[ \begin{aligned} &\sum_{i=1}^{n}i[gcd(i,n)=1]\=&\sum_{i=1}^{n}i\sum_{x|gcd(i,n)}\mu (x)\=&\sum_{i=1}^n i\sum_{x|i,x|n}\mu(x)\=&\sum_{x|n}\mu(x)x^d\sum_{i=1}^{\frac{n}{x}}i^

NKOJ1236 a^b (数论定理的应用)

          a^b 对于任意两个正整数a,b(0<=a,b<10000)计算a b各位数字的和的各位数字的和的各位数字的和的各位数字的和. Input 输入有多组数据,每组只有一行,包含两个正整数a,b.最后一组a=0,b=0表示输入结束,不需要处理. Output 对于每组输入数据,输出ab各位数字的和的各位数字的和的各位数字的和的各位数字的和. Sample Input 2 3 5 7 0 0 Sample Output 8 5 思路: 数论定理:任何数除以9的余数等于各位数的和除

CodeForces 396A 数论 组合数学

题目:http://codeforces.com/contest/396/problem/A 好久没做数论的东西了,一个获取素数的预处理跟素因子分解写错了,哭瞎了,呵呵, 首先ai最大值为10^9,n为500,最坏的情况 m最大值为500个10^9相乘,肯定不能获取m了,首选每一个ai肯定是m的一个因子,然后能分解就把ai给分解素因子,这样全部的ai都分解了  就能得到m的 所有素因子 以及 所有素因子的个数,题目求的 是n个因子的 不同序列的个数,所以每次 只能选出n个因子,这n个因子由素因子

HDU 4861 Couple doubi(数论)

HDU 4861 Couple doubi 题目链接 题意:给定k,p,有k个球,每个球的值为1^i+2^i+...+(p-1)^i (mod p) (1 <= i <= k),现在两人轮流取球,最后球的值总和大的人赢,问先手是否能赢 思路:先手不可能输,非赢即平,那么只要考虑每种球的值, 利用费马小定理或欧拉定理,很容易得到该函数的循环节为p - 1, 那么i如果为p - 1的倍数,即为循环节的位置,那么每个值都为1,总和为p - 1 如果i不在循环节的位置,任取一个原根g,根据原根的性质,

UVA 10548 - Find the Right Changes(数论)

UVA 10548 - Find the Right Changes 题目链接 题意:给定a,b,c,表示货物的价值,求由A货物和B货物组成C货物有几种方法,判断有无解和是否有无限多种 思路:扩展欧几里得求通解,去计算上限和下限就能判断 代码: #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const long l

hdu 4542 数论 + 约数个数相关 腾讯编程马拉松复赛

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4542 小明系列故事--未知剩余系 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 889    Accepted Submission(s): 207 Problem Description "今有物不知其数,三三数之有二,五五数之有三,七七数之有