TrickGCD
来源:互联网 发布:js 百度地图样式修改 编辑:程序博客网 时间:2024/06/07 05:27
HDU 6053
容斥原理
显然对于答案,我们只需要对那些质因数分解后任何一种质数都只会出现一次的进行处理。这个可以先进行线性筛然后nlogn统计那些数满足要求。对于这些数求出
#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); }}
阅读全文
0 0
- TrickGCD
- TrickGCD
- TrickGCD
- HDU6053-TrickGCD
- [HDU6035] TrickGCD
- hdu6053 TrickGCD
- HDU6053-TrickGCD
- HDU6053 TrickGCD
- TrickGCD hdu6053
- TrickGCD HDU
- TrickGCD HDU
- HDU 6053 TrickGCD
- HDU 6053 TrickGCD
- HDU-6053 TrickGCD
- 2017 多校 TrickGCD
- [数论 反演] HDU6053. TrickGCD
- HDU6053 TrickGCD【数学】
- hdu 多校 TrickGCD
- HDU 4609 3-idiots (FFT)
- 采用行为树快速开发游戏AI
- CodeForces 305A Strange Addition(思维题)
- 完全卸载oracle11g步骤
- Linux中高效编写Bash脚本的10个技巧
- TrickGCD
- 计算SD卡的总空间和可用大小
- 新JEP将简化Java类型变异
- install ubuntu source code
- HDU3394 Railway —— 点双联通分量 + 桥
- 使用Spring Boot快速构建基于SQLite数据源的应用
- G
- 线段树
- java的算术右移(>>)与逻辑右移(>>>)