POJ 1091 跳蚤(数论+容斥)

来源:互联网 发布:ad hoc网络 举例 编辑:程序博客网 时间:2024/05/23 01:23

Description
有n个不超过m的正整数a1,…,an,问有多少种满足条件的a序列使得gcd(a1,…,an)=1
Input
两个整数n和m(n<=15,m<=10^8)
Output
满足条件的a序列个数
Sample Input
2 4
Sample Output
12
Solution
总方案数为m^n,不满足条件的方案是当这n个数都含有m的某一个因子,对于某一个因子p,不满足条件的方案数为(m/p)^n,由容斥原理知
这里写图片描述
Code

#include<cstdio>#include<iostream>using namespace std;typedef long long ll;ll n,m,ans;ll pow(ll a,ll b){    ll ans=1ll;    while(b)    {        if(b&1)ans=ans*a;        a=a*a;        b>>=1;    }    return ans;}int main(){    while(~scanf("%lld%lld",&n,&m))    {        ans=pow(m,n);        ll mm=m;        for(ll i=2;i*i<=mm;i++)            if(m%i==0)            {                ll temp=pow(i,n);                ans=ans/temp*(temp-1);                while(m%i==0)m/=i;            }        if(m>1)ans=ans/pow(m,n)*(pow(m,n)-1);        printf("%lld\n",ans);    }    return 0;}
0 0
原创粉丝点击