Codeforces Round#450 div2 D - Unusual Sequences

吐槽自己 : 从上次青岛区域赛回来自己的做题时间约等于零,发现自己变得超级菜啊,最近要找找手感要不ec 要凉了啊

题意 :很容易理解 不说了

题解 : 首先如果 y 不能整除 x 肯定无解,这就是唯一的一种无解的情况,下面说有解的情况,就是y 整除 x ,在y 整除 x的情况下,有多少解呢 ?思想就是对 y / x的质因数进行容斥,用全部的减去不符合条件的,利用状态压缩思想进行二进制枚举就好了。具体细节看代码好了

#include 
#include 
#include 
#define ll long long
using namespace  std;

const ll mod = 1e9 + 7;
const int maxn = 1005;
int p[maxn] = {0};
ll lpow (ll a,ll b) {
    if (b == 0) return 1;
    ll res = lpow (a,b / 2) % mod;
    res = res * res % mod;
    if (b % 2) res = res * a % mod;
    return res % mod;
}
int main() {
    ios_base :: sync_with_stdio(false);
    ll a,b;
    cin >> a >> b;
    if (b % a) {
        cout << 0 << endl;
        return 0;
    }
    ll y = b / a;
    ll yy = y;
    int cnt = 0;
    for (ll i = 2;i * i <= y; ++ i) {
        if (y % i) continue;
        p[cnt ++] = i;
        while (y % i == 0) y /= i;
    }
    if (y > 1) p[cnt ++] = y;
    ll res=0;
    for (int i = 0;i < (1 << cnt); ++ i) {
        ll temp = 1;
        int c = 0;
        for (int j = 0;j < cnt; ++ j) {
            if ((1 << j) & i) {temp *= p[j];c ++;}
        }
        if (c % 2) {
            res -= lpow(2ll, yy / temp - 1ll);
        }
        else res += lpow (2ll,yy / temp - 1ll);
        res = (res + mod) % mod;
    }
    cout << res % mod << endl;
    return 0;
}

你可能感兴趣的:(codeforces,状态压缩)