首页 > 代码库 > HDU 4135-Co-prime(容斥原理)
HDU 4135-Co-prime(容斥原理)
题目链接:传送门
题意:求区间[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; }
HDU 4135-Co-prime(容斥原理)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。