HDU 4135(Co-prime-[1,m]内与n互质的数的个数)

来源:互联网 发布:美工设计网站大全 编辑:程序博客网 时间:2024/05/17 23:02

[1,m]内与n互质的数的个数
n<=10^9 ,m<=10^18
如果m改为n,就是欧拉函数

现在由于n很小,我们考虑最原始的容斥
令f(A) 表示 [1,m]中 A的倍数 的个数 ,其中A是n的因子

答案= 总数 - 有一个质因子的倍数 + 有两个质因子的倍数 …

#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<functional>#include<iostream>#include<cmath>#include<cctype>#include<ctime>#include<vector> #include<iomanip> using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=pre[x];p;p=next[p])#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  #define Lson (x<<1)#define Rson ((x<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,127,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define INF (2139062143)#define F (100000007)#define pb push_back#define mp make_pair#define fi first#define se secondtypedef long long ll;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}ll a,b,n;vector<ll> D;ll f[1000],flag[1000];ll calc(ll m) {    ll ans=0;    int sz=D.size();    f[0]=1;flag[0]=1;    for(int b=0;b<(1<<sz);++b) {        for(int j=0;j<sz;j++) {            if ( ! (b&(1<<j)) )  {                f[b|(1<<j)] = f[b]*D[j];                flag[b|(1<<j)]=-flag[b];            }         }        ans+=flag[b]*(m/f[b]);    }    return ans;} int main(){//  freopen("hdu4135.in","r",stdin);//  freopen(".out","w",stdout);    int T;cin>>T;    For(kcase,T) {        cin>>a>>b>>n;        D.clear();        for(int d=2;d*d<=n;d++) {            if (n%d==0) {                D.pb(d);                while (n%d==0) n/=d;            }         }        if (n>1) D.pb(n);         cout<<"Case #"<<kcase<<": "<<calc(b)-calc(a-1)<<endl;    }    return 0;}
0 0