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
");
        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
",dp[0]);
    return 0;
}

不摆烂了,写题
原文地址:https://www.cnblogs.com/hunxuewangzi/p/15109532.html