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;
}
不摆烂了,写题