首页 > 代码库 > HDU 4135
HDU 4135
容斥原理简单应用
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#define LL __int64#define Np 100000using namespace std;bool isprime[Np];LL prime[Np],np;LL fac[100],fp;void initial(){ np=0; memset(isprime,true,sizeof(isprime)); for(LL i=2;i<Np;i++){ if(isprime[i]){ prime[np++]=(LL)i; for(LL j=i*i;j<Np;j+=i) isprime[j]=false; } }}void dfs(LL i,LL num, LL p,LL s,LL &ans,LL n){ if(i>=n){ if(num==0){ ans=s; } else if(num&1){ ans-=s/p; } else ans+=s/p; return ; } dfs(i+1,num,p,s,ans,n); dfs(i+1,num+1,p*fac[i],s,ans,n);}LL work(LL a,LL b,LL n){ LL p=n; fp=0; for(LL i=0;i<np&&prime[i]*prime[i]<=p;i++){ if(p%prime[i]==0){ fac[fp++]=prime[i]; while(p%prime[i]==0) p/=prime[i]; } } if(p>1) fac[fp++]=p; LL ansA,ansB; ansA=ansB=0; dfs(0,0,1,a-1,ansA,fp); dfs(0,0,1,b,ansB,fp); return ansB-ansA;}int main(){ int T,kase=0; LL a,b,n; initial(); scanf("%d",&T); while(T--){ scanf("%I64d%I64d%I64d",&a,&b,&n); LL ans=work(a,b,n); printf("Case #%d: %I64d\n",++kase,ans); } return 0;}
HDU 4135
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。