TrickGCD
2017-08-15 20:57
120 查看
HDU 6053
容斥原理
显然对于答案,我们只需要对那些质因数分解后任何一种质数都只会出现一次的进行处理。这个可以先进行线性筛然后nlogn统计那些数满足要求。对于这些数求出∏Aii,如果 i 的质数个数为奇数那么就加,否则就减。但是只是想到这点还是会TLE,每次枚举的i都要把A数组扫描一遍肯定不行,还需要用前缀和来维护。用 sum[i] 表示 [1,i]出现的数,那么我们就可以通过枚举 j = Aii,要求的就是∏jsum[i∗(j+1)−1]−sum[i∗j+1],这样时间就是nlognlogn的了。
容斥原理
显然对于答案,我们只需要对那些质因数分解后任何一种质数都只会出现一次的进行处理。这个可以先进行线性筛然后nlogn统计那些数满足要求。对于这些数求出∏Aii,如果 i 的质数个数为奇数那么就加,否则就减。但是只是想到这点还是会TLE,每次枚举的i都要把A数组扫描一遍肯定不行,还需要用前缀和来维护。用 sum[i] 表示 [1,i]出现的数,那么我们就可以通过枚举 j = Aii,要求的就是∏jsum[i∗(j+1)−1]−sum[i∗j+1],这样时间就是nlognlogn的了。
#include <bits/stdc++.h> using namespace std; const int maxn = 100010; const int maxm = 100000; const long long mo = 1000000007; int a[maxn], p[maxn], num[maxn], n, x, m; void getPrime() { memset(p, 0, sizeof(p)); for (int i = 2; i <= maxm; i++) { if (!p[i]) p[++p[0]] = i; for (int j = 1; j <= p[0] && p[j] <= maxm/i; j++) { p[p[j]*i] = 1; if (i%p[j] == 0) break; } } memset(num, 0, sizeof(num)); for (int i = 1; i <= p[0]; i++) { for (int j = maxm/p[i]; j >= 1; j--) if (num[j]) num[j*p[i]] = num[j]+1; num[p[i]] = 1; } } long long ans, t; int get(int x, int y) { //x^y long long tt = 1, tx = x; while (y > 0) { if (y%2) tt = (tt*tx)%mo; tx = (tx*tx)%mo; y /= 2; } return tt; } int main() { getPrime(); int T; scanf("%d", &T); for (int cases = 1; cases <= T; cases++) { memset(a, 0, sizeof(a)); scanf("%d", &n); m = maxm; for (int i = 1; i <= n; i++) { scanf("%d", &x); a[x]++; m = min(m, x); } ans = 0; for (int i = 1; i <= maxm; i++) a[i] += a[i-1]; for (int i = 2; i <= m; i++) if (num[i]) { t = 1; for (int j = 1; i*j <= maxm; j++) { t = (t*get(j, a[min(maxm, i*(j+1)-1)]-a[i*j-1])) %mo; } if (num[i]%2) ans = (ans+t)%mo; else ans = (ans+mo-t)%mo; } printf("Case #%d: %lld\n", cases, ans); } }
相关文章推荐
- hdu 6053 TrickGCD 筛法
- hdu 6053 TrickGCD 筛法+莫比乌斯函数+分块处理
- HDU 6053 TrickGCD(分块+容斥)——2017 Multi-University Training Contest - Team 2
- 【数论-莫比乌斯】hdu 6053 TrickGCD
- HDU6053 TrickGCD(2017多校第2场)
- HDU 6053 TrickGCD 线性筛 思维 容斥
- HDU 6053 TrickGCD 数论
- TrickGCD(莫比乌斯函数,容斥)
- 解题报告:HDU_6053 TrickGCD 莫比乌斯反演
- 2017 Multi-University Training Contest 2 && HDOJ 6053 TrickGCD 【容斥+莫比乌斯函数】
- HDU 6053 TrickGCD (莫比乌斯函数)
- HDU 6053 TrickGCD(莫比乌斯反演)
- (2017多校训练第二场)HDU - 6053 TrickGCD 初见莫比乌斯
- hdu 6053 TrickGCD [莫比乌斯函数]
- HDU6053-TrickGCD 容斥原理+莫比乌斯反演
- HDU6053 TrickGCD【数学】
- 2017多校第二场 HDU 6053 TrickGCD 莫比乌斯反演
- HDU 6053 TrickGCD(莫比乌斯反演)
- 2017多校训练赛第二场 HDU 6053 TrickGCD(容斥原理/莫比乌斯反演)
- HDU 6053 - TrickGCD | 2017 Multi-University Training Contest 2