D. Unusual Sequences(容斥)

D. Unusual Sequences

 

隔板法 + 容斥原理

 1 //容斥(莫比乌斯反演)
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 #define LL long long 
 5 const int mod = 1e9+7;
 6 LL quickpow(LL a, LL b, LL mod){
 7     LL temp = a % mod, res = 1;
 8     while(b){
 9         if(b & 1)  res = res * temp % mod;
10         b >>= 1;
11         temp = temp * temp % mod;
12     }
13     return res;
14 }
15 map<int, LL> mp;
16 
17 LL solve(int x){
18     if(x == 1) return 1;
19     if(mp.count(x)) return mp[x];
20     mp[x] = quickpow(2, x-1, mod);
21     for(int i = 2; i * i <= x; i++){
22         if(x % i == 0){
23             mp[x] = (mp[x] - solve(i) + mod) % mod;
24             if(i != x / i) mp[x] = (mp[x] - solve(x / i) + mod) % mod;
25         }
26     }
27     mp[x] = (mp[x] - solve(1) + mod) % mod;
28     return mp[x];
29 }
30 
31 int main(){
32     ios::sync_with_stdio(0);
33     int x, y;
34     while(cin>>x>>y){
35         if(y % x != 0){
36             cout<<0<<endl;
37         }else{
38             cout<<solve(y / x)<<endl;
39 
40         }
41     }
42 
43 }
View Code

 

转载于:https://www.cnblogs.com/yijiull/p/8322024.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值