【容斥原理】HDU 4135 Co-prime
2015-04-02 17:50
549 查看
http://acm.hdu.edu.cn/showproblem.php?pid=4135
题意:求[a,b]中与n互质的数的个数
ans=sum(b)-sum(a-1),sum(a)表示[1,a]中与n互质的数的个数
问题转化为求[1,a]中与n互质的数的个数
可求[1,a]中与n不互质的数的个数μ,即[1,a]中n的因数,再用a减去即得sum(a)
算出n的质因数p1,p2,..pk,利用容斥原理可求μ:
$$\begin{split}
\mu =\sum_{i=1}^{k}\frac{n}{p_i} &- \sum_{1\leq i<j\leq k}\frac{n}{p_ip_j}\\
&+\sum_{1\leq i<j<q\leq k}\frac{n}{p_ip_jp_q}\\
&-\cdots\\
&+{\left( -1\right)}^{k-1}\frac{n}{\prod_{i=1}^{k}{p_i}}
\end{split}$$
(奇加偶减)
容斥实现(位运算):
用二进制来1,0来表示第几个素因子是否被用到,如m=3,三个因子是2,3,5,则i=3时二进制是011,表示第2、3个因子被用到
题意:求[a,b]中与n互质的数的个数
ans=sum(b)-sum(a-1),sum(a)表示[1,a]中与n互质的数的个数
问题转化为求[1,a]中与n互质的数的个数
可求[1,a]中与n不互质的数的个数μ,即[1,a]中n的因数,再用a减去即得sum(a)
算出n的质因数p1,p2,..pk,利用容斥原理可求μ:
$$\begin{split}
\mu =\sum_{i=1}^{k}\frac{n}{p_i} &- \sum_{1\leq i<j\leq k}\frac{n}{p_ip_j}\\
&+\sum_{1\leq i<j<q\leq k}\frac{n}{p_ip_jp_q}\\
&-\cdots\\
&+{\left( -1\right)}^{k-1}\frac{n}{\prod_{i=1}^{k}{p_i}}
\end{split}$$
(奇加偶减)
容斥实现(位运算):
用二进制来1,0来表示第几个素因子是否被用到,如m=3,三个因子是2,3,5,则i=3时二进制是011,表示第2、3个因子被用到
#include<cstdio> #include<algorithm> #include<iostream> #include<cmath> #include<cstring> #include<queue> using namespace std; #define MAX(a,b) ((a>b)?(a):(b)) #define MIN(a,b) ((a<b)?(a):(b)) #define N 100005 #define INF 1<<30 #define LL __int64 LL cal(LL n,LL r)//计算[1,r]中与n互质的个数 { /***********************************/ //求所有n的质因数 vector<LL> p; for(LL i=2;i*i<=n;++i){ if(n%i==0){ p.push_back(i); while(n%i==0)n/=i; } } if(n>1) p.push_back(n); /***********************************/ //容斥原理实现 LL ans=0; for(LL i=1;i<(1<<p.size());++i){//用二进制来1,0来表示第几个素因子是否被用到,如m=3,三个因子是2,3,5,则i=3时二进制是011,表示第2、3个因子被用到 LL multi=1,cnt=0;//乘积,乘数数量 for(LL j=0;j<p.size();++j){ if(i&(1<<j)){//判断第几个因子目前被用到 cnt++; multi*=p[j]; } } LL cur=r/multi; if(cnt&1) ans+=cur;//奇加偶减 else ans-=cur; } return r-ans; } int main(){ //freopen("C:\\Users\\F\\Desktop\\in.txt", "r", stdin); //freopen("C:\\Users\\F\\Desktop\\out.txt", "w", stdout); int t,cas=1; LL a,b,n; scanf("%d",&t); while(t--){ scanf("%I64d%I64d%I64d",&a,&b,&n); printf("Case #%d: ",cas++); printf("%I64d\n",cal(n,b)-cal(n,a-1)); } return 0; }
相关文章推荐
- HDU 4135 Co-prime(容斥原理)
- hdu 4135 Co-prime【容斥原理】
- HDU 4135 Co_prime(容斥原理、[A,B]中和n互素数个数)
- 【HDU】4135 - Co-prime(容斥原理)
- hdu 4135 Co-prime(容斥原理)
- HDU - 4135 Co-prime (容斥原理典型题)
- HDU 4135 Co-prime (容斥原理, 数学)
- hdu 4135 Co-prime(容斥原理)
- HDU 4135-Co-prime(容斥原理)
- hdu 4135 Co-prime 容斥原理
- HDU-4135 Co-prime 容斥原理
- HDU 4135 Co-prime(容斥原理 + 基础数论)
- hdu 4135 Co-prime 容斥原理
- hdu 4135 Co-prime(容斥原理)
- hdu 4135 Co-prime 容斥原理
- hdu 4135 Co-prime(容斥原理)
- hdu 4135 Co-prime +hdu 2841 Visible Trees(容斥原理)
- !HDU 4135 Co-prime-容斥原理-(位运算技巧)
- hdu 4135 Co-prime(容斥原理)
- hdu 4135 Co-prime(容斥原理)