hdu1695 容斥原理
2013-07-02 19:48
232 查看
抄来的代码,第一次搞容斥原理。
原问题转化为 gcd(x,y)=k -> gcd(x/k,y/k)=1,两者互质的问题
首先联想到欧拉函数,它是互质问题计数的工具,但它只能解决(x,y) 中x<y,通过phi[y]得到,如果x,y的范围一样,这时候就已经解决了
但现在范围不一样,就要用到容斥原理求出超出范围那些部分
当(x,y)中x>y,要一个一个用容斥原理求【b+1,d】中每个数的质因数能否整除【1,b】中的数,那些不能的就是互质的
区间中与i不互质的个数 = (区间中i的每个质因数的倍数个数)-(区间中i的每两个质因数乘积的倍数)+(区间中i的每3个质因数的成绩的倍数个数)-(区间中i的每4个质因数的乘积)+...
原问题转化为 gcd(x,y)=k -> gcd(x/k,y/k)=1,两者互质的问题
首先联想到欧拉函数,它是互质问题计数的工具,但它只能解决(x,y) 中x<y,通过phi[y]得到,如果x,y的范围一样,这时候就已经解决了
但现在范围不一样,就要用到容斥原理求出超出范围那些部分
当(x,y)中x>y,要一个一个用容斥原理求【b+1,d】中每个数的质因数能否整除【1,b】中的数,那些不能的就是互质的
区间中与i不互质的个数 = (区间中i的每个质因数的倍数个数)-(区间中i的每两个质因数乘积的倍数)+(区间中i的每3个质因数的成绩的倍数个数)-(区间中i的每4个质因数的乘积)+...
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <map> #include <set> #include <algorithm> #include <ctime> #include <vector> #include <string> #include <stack> #include <queue> using namespace std; #define N 100000 #define ll long long ll phi[N+20]; ll prime[N+20],cnt; vector<ll>p[N+20]; void phi_table(ll n) { phi[1]=1; for(ll i=2;i<=n;++i) if(!phi[i]) { prime[cnt++]=i; for(ll j=i;j<=n;j+=i) { if(!phi[j]) phi[j]=j; phi[j]=phi[j]/i*(i-1); } } } void init(ll n) { p[1].push_back(1); for(ll i=2;i<=n;++i) { ll k=i; for(int j=0;prime[j]*prime[j]<=i;++j) { if(k%prime[j]==0) { p[i].push_back(prime[j]); while(k%prime[j]==0) k/=prime[j]; } if(k==1) break; } if(k>1) p[i].push_back(k); } } ll dfs(int idx,ll b,ll cur) { ll res=0; for(int i=idx;i<p[cur].size();++i) { ll k=b/p[cur][i]; res+=k-dfs(i+1,k,cur); } return res; } int main () { ll a,b,c,d,k; int ncase; phi_table(100000); init(100000); scanf("%d",&ncase); for(int kk=1;kk<=ncase;++kk) { scanf("%I64d%I64d%I64d%I64d%I64d",&a,&b,&c,&d,&k); if(b>d) swap(b,d); if(k==0) { printf("Case %d: 0\n",kk); continue; } b/=k; d/=k; ll ans=0; for(int i=1;i<=b;++i) ans+=phi[i]; for(ll i=b+1;i<=d;++i) { ans+=b-dfs(0,b,i); } printf("Case %d: %I64d\n",kk,ans); } return 0; }
相关文章推荐
- hdu 1695 GCD(容斥原理)
- HDU 1695 GCD(素因子分解+容斥原理+欧拉函数)
- HDU 1695 GCD ★(容斥原理+欧拉函数)
- Hdu 1695 GCD (数论 容斥原理)
- HDU 1695 GCD ★(容斥原理+欧拉函数)
- hdu 1695 GCD(容斥原理)
- [容斥原理] hdu 1695 GCD
- 【HDU】1695 - GCD(欧拉函数 & 容斥原理)
- hdu 1695 数论+容斥原理
- hdu 1695 容斥原理或莫比乌斯反演
- hdu 1695 欧拉函数 + 容斥原理
- HDU 1695:GCD _容斥原理
- hdu 1695 GCD (欧拉函数、容斥原理)
- HDU 1695 GCD 解题报告(欧拉函数 + 容斥原理)
- HDU 1695 GCD 容斥原理+欧拉
- hdu1695 GCD(容斥原理+欧拉函数)
- [ACM] HDU 1695 GCD (容斥原理)
- HDU 1695 GCD (容斥原理)
- hdu 1695 ( “变态” 的欧拉函数 加 容斥原理)
- hdu-1695 容斥原理+欧拉函数