1. 程式人生 > 其它 >D. Unusual Sequences 題解(容斥+質因子數量結論)

D. Unusual Sequences 題解(容斥+質因子數量結論)

題目連結

題目思路

一個重要結論就是\(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;
}

卷也卷不過,躺又躺不平