容斥原理 学习 M

来源:互联网 发布:画婚礼图软件 编辑:程序博客网 时间:2024/06/03 20:15

https://vjudge.net/contest/177165#rank
欢迎来刷我抄的专题.

因为数不大,很快就想到了质因数分解,然后容斥原理做一遍,但是取余的地方没细心.爆long long 却一直没发现.卡了很久.

思路大抵就是 : 质因数分解, 算每一个质因数的贡献,但我们平常所减的是求个数的,这里求完了个数后转变成和其实也蛮简单的, 我们这样考虑 1 - (n-1)中有a个p质因数的倍数, 那么这个质因数的贡献就是p*sum(1+2+..+a), 然后容斥消去重复 的就行了.

#include<cstdio>#include<iostream>#include<bitset>#include<cstring>#define ll long longconst int maxn = 5e5;using namespace std;const int mod = 1000000007;bitset<maxn> judge;int prime[maxn];int tot = 0;ll l,r,n;ll co[maxn];void init(){    judge.reset();    tot = 0;    for(int i = 2; i < maxn ; i++){        if(!judge[i]){            prime[tot++] = i;        }        for(int j = 0; j < tot ;j++){            if(i*prime[j] >= maxn)break;            judge[i*prime[j]] = 1;            if(i%prime[j] == 0){                break;            }        }    }}ll sum(ll n){    if(n%2==0){        return ((n/2)%mod*((n+1)%mod))%mod;    }else{        return ((n+1)/2%mod*(n%mod))%mod;    }}int cnt = 0;void slove(ll n){    cnt = 0;    for(int i = 0; i < tot && prime[i] <= n;i ++){        if(n%prime[i] == 0){            co[cnt++] = prime[i];            while(n%prime[i] == 0){                n /= prime[i];            }        }    }    if(n>1){        co[cnt++] = n;    }}ll cal(ll a){    ll ans = 0;    ll temp = 1;    int cc = 0;    for(int i = 1; i < (1<<cnt); i++){        temp = 1;        cc = 0;        for(int j = 0; j <cnt; j++){            if(i & (1<<j)){                temp *= co[j];                cc ++ ;            }        }        if(cc&1)ans += ((sum(a/temp)%mod)*(temp%mod))%mod;        else ans -= ((sum(a/temp)%mod)*(temp%mod))%mod;        ans = (ans%mod + mod)%mod;    }    return ans;}int main(){    init();    //FILE *fp;    //fp = fopen("in.txt", "w+");    //for(int r = 1; r < mod; r++){    while(scanf("%lld",&r) && r){        n = r;        slove(n);        printf("%lld\n",cal(r-1)%mod);    }}

后来发现其实别人用欧拉函数做更有趣,
我们看到gcd(a, n) = 1, 那么肯定就有gcd(a, n-a) = 1,这样我们算到的phi[n]*n/2就是1 - (n-1)中与n互质的数和.
然后减一下就出来了.

n(n1)/2%modnϕ(n)/2%mod+2mod)%mod

原创粉丝点击