HDU6053TrickGCD
来源:互联网 发布:java方法泛型 t.class 编辑:程序博客网 时间:2024/06/05 06:58
题目连接
题意
给定一个长为n的数组A,求解一定条件下能构造多少个不同数组B。条件为
分析
显然gcd最小的情况必然是在
代码
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<map>#include<cmath>#include<queue>using namespace std;const int N = 100000 + 10;const int mod = 1e9 + 7;int T, n, a[N], ca[N*2], inv[N] = {0, 1}, cnt[N], vis[N];int mn, mx;long long quick_pow(long long a,long long b){ long long ret=1; while(b){ if(b&1) ret=(ret*a)%mod; b>>=1; a=(a*a)%mod; } return ret;}bool isSqr[N];int lowbit(int x){ return x&-x;}void prime() { memset(isSqr, 0, sizeof(isSqr)); for(int i=2;i<=100000;i++) { if(cnt[i]) continue; for(int j=i;j<=100000;j+=i) { cnt[j]++; if(j % (i*i) == 0) isSqr[j] = 1; } }}int getnum(int k){ long long ret=1; for(int i=1;i<=100000;++i){ if(k*i>mx) break; int num=ca[k*(i+1)-1]-ca[k*i-1]; if(num==0) continue; ret*=quick_pow(i,num); if(ret>mod) ret%=mod; } return ret;}int main(){ for(int i=2;i<N;i++) inv[i] = (mod - mod/i) *1ll* inv[mod%i] % mod; prime(); scanf("%d", &T); for(int ica=1;ica<=T;ica++) { scanf("%d", &n); memset(ca,0,sizeof(ca)); mn=100000,mx=0; for(int i=1;i<=n;i++) { scanf("%d", &a[i]); mn = min(mn, a[i]); mx = max(mx,a[i]); ca[a[i]]++; } if(mn == 1) { printf("Case #%d: 0\n", ica); continue; } for(int i=2;i<N*2;++i) ca[i]+=ca[i-1]; int ans = 0; int func = 1; for(int i=2;i<=mn;i++) { func=getnum(i); if(isSqr[i]) continue; if(cnt[i] % 2) ans += func; else ans -= func; ans%=mod; } ans=(ans+mod)%mod; printf("Case #%d: %d\n", ica, ans); }}
阅读全文
0 0
- HDU6053TrickGCD
- hdu6053TrickGCD(莫比乌斯反演)
- HDU6053TrickGCD(莫比乌斯函数)
- SmartisanDialog
- bootstrap系列之四表格样式
- 利用函数组的全局变量实现数据传递
- 集合总结
- 综合影响力模型InfG算法
- HDU6053TrickGCD
- jquery 获取 input 名为数组
- Ubuntu安装中文输入法
- matlab中findstr 与 strfind的两个函数举例
- java.io.EOFException: Unexpected end of ZLIB input stream解决
- pycharm常用设置(keymap设置及eclipse常用快捷键总结)
- 状态模式
- JVM虚拟机学习笔记01:类的加载、连接、初始化
- Kotlin学习笔记(1):标签