hdu 6053TrickGCD(线性筛+莫比乌斯函数+前缀和)
来源:互联网 发布:抱枕材料 知乎 编辑:程序博客网 时间:2024/05/29 17:34
TrickGCD
Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 746 Accepted Submission(s): 293
Problem Description
You are given an array
*
* For each pair( l , r ) (
Input
The first line is an integer T(
Each test case begins with an integer number n describe the size of array
Then a line contains
You can assume that
Output
For the
Sample Input
144 4 4 4
Sample Output
Case #1: 17
#include<cstdio>#include<cstring>using namespace std;const int N = 1e5+4;bool vis[N];int prime[N],cnt,mu[N]; void Init() //线性筛求莫比乌斯{ memset(vis,0,sizeof(vis)); mu[1] = 1; cnt = 0; for(int i=2; i<N; i++) { if(!vis[i]) //vis用于标记是否是非素数,若是素数则为false { prime[cnt++] = i; //i=d mu[i] = -1; } for(int j=0; j<cnt&&i*prime[j]<N; j++) { vis[i*prime[j]] = 1; if(i%prime[j]) mu[i*prime[j]] = -mu[i]; //如果这个合数(暂且说成合数,质数的情况同理)不能被prime[j]整除,prime[j]肯定不是i的因子(换句话说i中没有与prime[j]相同的因子) else //如果i%prime[j]==0那么i肯定可以分解成prime[j]*(某一个数),这样到之后k=i*prime[j+1]时,k肯定可以从prime[j+1]*(某一个数)*prime[j]得到(一个更大的合数*一个更小的质数得到你) { mu[i*prime[j]] = 0; //如果这个合数(质数)能被prime[j]整除,那么prime[j]就是i的因子,i*prime[j]中肯定有相同的质因子 break; //这样相比与普通筛法O(n*logn*logn)就避免了重复,使得复杂度可以降到O(n) } } }}int main(){Init();printf("1\n");}
#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;typedef long long int ll;const int MAXN = 1e5+10;const int INF = 1999999999;const int MOD = 1e9+7;bool vis[MAXN];ll prime[MAXN],cnt,mu[MAXN]; ll a[MAXN],n,sum[MAXN]; //sum[i]表示a中不大于i的数的个数ll Max,Min;void Mobius() //根据线性筛法来求莫比乌斯函数{ memset(vis,0,sizeof(vis)); cnt=0; mu[1]=1; for(int i=2;i<MAXN;i++) { if(!vis[i]) { prime[cnt++]=i; mu[i]=-1; } for(int j=0;j<cnt&&i*prime[j]<MAXN;j++) { vis[i*prime[j]]=1; if(i%prime[j]) mu[i*prime[j]]=-mu[i]; else { mu[i*prime[j]]=0; break; } } } for(int i=2;i<MAXN;i++) mu[i]=-mu[i];}ll quickpow(ll b,ll k) //快速幂{ ll ans=1; while(k) { if(k&1)ans=(ans*b)%MOD; b=(b*b)%MOD; k>>=1; } return ans;}void solve(){ ll ans=0; for(ll i=2;i<=Min;i++) //枚举k { if(!mu[i]) continue; //符号为0是跳过 ll j=i-1; ll k=2*i-1; ll res=1; for(ll p=1;;p++) //计算每一个i对答案的贡献 { //通过计算每个i的p倍区间内,a[]有几个数在这个区间内这就表示p的指数 if(sum[k]-sum[j]) //表示在i的p倍区间内a中有sum[k]-sum[j]个数 res=(res*quickpow(p,sum[k]-sum[j]))%MOD; // = 1^(sum[2k-1]-sum[k-1]) * 2^(sum[3k-1]-sum[2k-1]) * 3^(sum[4k-1]-sum[3k-1]) ... if(k>=Max)break; j+=i; k+=i; if(k>Max)k=Max; } ans=(ans+mu[i]*res)%MOD; //mu[i]表示符号 } if(ans<0)ans=ans+MOD; printf("%lld\n",ans%MOD);}int main(){ int t,q; scanf("%d",&t); Mobius(); //求每一个k的符号 q=0; while(t--) { q++; scanf("%lld",&n); Max=-1; Min=INF; memset(sum,0,sizeof(sum)); for(ll i=1;i<=n;i++) { scanf("%lld",&a[i]); Max=max(a[i],Max); //这个a中的最大值 Min=min(a[i],Min); sum[a[i]]++; } sum[0]=0; for(ll i=1;i<=Max;i++) //算出每一个前缀和来求贡献 sum[i]+=sum[i-1]; printf("Case #%d: ",q); solve(); }}
- hdu 6053TrickGCD(线性筛+莫比乌斯函数+前缀和)
- HDU 6053 TrickGCD(莫比乌斯反演+前缀和)
- HDU-6053 TrickGCD 前缀和数组,莫比乌斯函数
- HDU 6053 TrickGCD (莫比乌斯函数)
- HDU 6053 TrickGCD(莫比乌斯函数)
- HDU 6053 TrickGCD (莫比乌斯函数+分块筛)
- hdu 6053 TrickGCD [莫比乌斯函数]
- Hdu-6053 TrickGCD(莫比乌斯函数)
- HDU 6053 TrickGCD(莫比乌斯反演)
- hdu 6053 TrickGCD(莫比乌斯反演)
- HDU 6053 TrickGCD(莫比乌斯反演)
- hdu 6053 TrickGCD(容斥,分段,莫比乌斯函数)
- TrickGCD(HDU 6053 莫比乌斯函数的反演)
- (多校02)hdu 6053 trickgcd (莫比乌斯函数)
- hdu 6053 TrickGCD 容斥 莫比乌斯
- HDU 6053 TrickGCD(莫比乌斯反演+分块)
- HDU 6053 TrickGCD 莫比乌斯反演||筛法
- 【HDU 6053 TrickGCD】 + 莫比乌斯反演
- Unity3D 【编辑器扩展】一键批量修改预设UGUI Text字体
- android 锁屏页
- Button的使用
- 应用jquery操作元素样式(二)
- Android 弹出软键盘的问题
- hdu 6053TrickGCD(线性筛+莫比乌斯函数+前缀和)
- Intellij IDEA 快捷键整理
- Codeforces Round #427 (Div. 2)
- 优雅的退出应用和处理崩溃异常自动重启
- or运算
- 家庭媒体中心解决方案(三、群晖系列nas基本功能使用指南篇1)
- django manage.py命令,可以创建用户等
- AppCompat 包破坏Launcher Widget ,导致couldn't find any view, using error view
- BZOJ2301(75/600)