D. Unusual Sequences 題解(容斥+質因子數量結論)
阿新 • • 發佈:2021-08-06
題目連結
題目思路
一個重要結論就是\(x\)的因子個數最多\(\sqrt[ 3]{x }\)
然後再隨便容斥下即可
程式碼
卷也卷不過,躺又躺不平#include<bits/stdc++.h> #define fi first #define se second #define debug cout<<"I AM HERE"<<endl; using namespace std; typedef long long ll; const ll INF=0x3f3f3f3f3f3f3f3f; const int maxn=4e3+5,inf=0x3f3f3f3f,mod=1e9+7; const double eps=1e-6; int x,y; int dp[maxn]; ll qpow(ll a,ll b){ ll ans=1,base=a; while(b){ if(b&1) ans=ans*base%mod; base=base*base%mod; b=b>>1; } return ans; } int main(){ cin>>x>>y; if(y%x!=0){ printf("0\n"); return 0; } int k=y/x; vector<int> vec; for(ll i=1;i*i<=k;i++){ if(k%i==0){ vec.push_back(i); if(k/i!=i){ vec.push_back(k/i); } } } sort(vec.begin(),vec.end()); for(int i=0;i<vec.size();i++){ dp[i]=qpow(2,k/vec[i]-1); } int sz=vec.size(); for(int i=sz-1;i>=0;i--){ for(int j=i-1;j>=0;j--){ if(vec[i]%vec[j]==0){ dp[j]-=dp[i]; dp[j]=(dp[j]%mod+mod)%mod; } } } printf("%d\n",dp[0]); return 0; }