njust1922 count_prime(容斥原理)

来源:互联网 发布:js取消注释快捷键 编辑:程序博客网 时间:2024/06/05 19:03

njust1922

题目

https://icpc.njust.edu.cn/Problem/Local/1922/

思路

模版:http://cse.seu.edu.cn/PersonalPage/hxue/downloadTalk/download4/%E5%AE%B9%E6%96%A5%E5%8E%9F%E7%90%86%E7%9A%84%E5%BA%94%E7%94%A8-%E9%99%88%E5%85%83%E5%A9%A7%EF%BC%8C%E9%BB%84%E4%BA%9A%E6%BE%8E.pdf
“当有更多个质因子的时候,可以用状态压缩解决,二进制位上是1表示这个质因子被取进去了。如果有奇数个1就相加,反之则相减。”

代码

#include<iostream>#include<cstdlib>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;typedef long long ll;ll solve(ll n,ll r){    vector<ll> p;    ll sum=0;    for(ll i=2; i*i<=n; i++)        if(n%i==0)        {            p.push_back(i);            while(n%i==0) n/=i;        }    if(n>1) p.push_back(n);    for(ll msk=1; msk<(1<<p.size()); msk++)    {        ll mult=1,bits=0;        for(ll i=0; i<p.size(); i++)        {            if(msk&(1<<i))            {                mult*=p[i];                bits++;            }        }        ll cur=r/mult;        if(bits&1)            sum+=cur;        else            sum-=cur;    }    return r-sum;}int main(){    int T;    scanf("%d",&T);    while(T--)    {        ll a,b,n;        scanf("%lld %lld %lld",&a,&b,&n);        printf("%lld\n",solve(n,b)-solve(n,a-1));    }    return 0;}
0 0
原创粉丝点击