HDU 4135-Co-prime(容斥原理)

来源:互联网 发布:淘宝帐号怎么注销 编辑:程序博客网 时间:2024/06/16 00:56

题目链接:传送门

题意:求区间[a,b]内与n互质的数的个数。

思路:用容斥求出[1-b]与n互质的个数—[1-(a-1)]内与n互质的个数。

 

#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>#include <string>#include <cctype>#include <vector>#include <cstdio>#include <cmath>#include <queue>#include <stack>#include <map>#include <set>#define maxn 360#define _ll __int64#define ll long long#define INF 0x3f3f3f3f#define Mod 1000000007#define pp pair<int,int>#define ull unsigned long long#define max(x,y) ( ((x) > (y)) ? (x) : (y) )#define min(x,y) ( ((x) > (y)) ? (y) : (x) )using namespace std;_ll fac[maxn],tot,A,B,N,ans;void div(int x){tot=0;for(_ll i=2;i*i<=x;i++){if(x&&x%i==0){fac[tot++]=i;while(x&&x%i==0)x/=i;}}if(x>1)fac[tot++]=x;}void dfs(_ll num,_ll s,_ll r,_ll n){if(num==tot){if(s&1)ans-=n/r;else ans+=n/r;return ;}dfs(num+1,s,r,n);dfs(num+1,s+1,r*fac[num],n);}int cas=1;void solve(){div(N);ans=0;dfs(0,0,1,B);_ll ans_1_b=ans;ans=0;dfs(0,0,1,A-1);_ll ans_1_a=ans;printf("Case #%d: %I64d\n",cas++,ans_1_b-ans_1_a);}int main(){int T;scanf("%d",&T);while(T--){scanf("%I64d%I64d%I64d",&A,&B,&N);solve();}return 0;}

1 0
原创粉丝点击