CSUST 簡單數學題 題解(質因子分解+並查集)
阿新 • • 發佈:2021-07-31
題目連結
題目大意
注意資料範圍,因為區間範圍最多\(1e6\),所以只要考慮\(1e6\)以內的質因子即可
然後用並查集維護一下集合即可
程式碼
卷也卷不過,躺又躺不平#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> pii; #define fi first #define se second #define debug printf("aaaaaaaaaaa\n"); const int maxn=1e6+5,inf=0x3f3f3f3f,mod=1e9+7; const ll INF=0x3f3f3f3f3f3f3f3f; const double eps=1e-7; ll a,b,p; int fa[maxn]; int prime[maxn],cnt; bool isprime[maxn]; int tot; void getprime(int n){ for(ll i=2;i<=n;i++){//開ll因為後面要計算i*prime[j] if(!isprime[i]){ prime[++cnt]=i; } for(int j=1;j<=cnt&&i*prime[j]<=n;j++){ isprime[i*prime[j]]=1; if(i%prime[j]==0) break; } } } int findd(int x){ return x==fa[x]?x:fa[x]=findd(fa[x]); } int main(){ getprime(1000000); int _; cin>>_; while(_--){ cin>>a>>b>>p; for(ll i=a;i<=b;i++){ fa[i-a+1]=i-a+1; } for(int i=1;i<=cnt;i++){ if(prime[i]<p) continue; ll beg=(a+prime[i]-1)/prime[i]*prime[i]; for(ll j=beg;j<=b;j+=prime[i]){ int x=findd(beg-a+1); int y=findd(j-a+1); if(x==y) continue; fa[y]=x; } } int ans=0; for(ll i=a;i<=b;i++){ if(findd(i-a+1)==i-a+1){ ans++; } } printf("Case #%d: %d\n",++tot,ans); } return 0; }