题目:http://poj.org/problem?id=1091
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 9058 | Accepted: 2709 |
Description
Input
Output
Sample Input
2 4
Sample Output
12
Hint
分析:跳蚤跳跃的过程划成数学表达式是 设卡片上的标号是x,系数是a,那么有:
于是要求在1---M-1内有多少N个数字的组合满足上式。对M因子分解,利用容斥原理求得不能达到要求的结果,那么最后答案就是
(容斥原理——奇加偶减)中间的因子个数奇偶性部分可以用2进制枚举
#include <iostream> #include <cstdio> using namespace std; typedef long long LL; const int maxn=1e4+10; LL factor[maxn],top; void resolve(LL x){ top=0; for(int i=2;i*i<=x;i++){ if(x%i==0){ factor[top++]=i; while(x%i==0) x/=i; } } if(x>1) factor[top++]=x; } LL power(LL a,LL p){ LL ans=1,temp=a; while(p){ if(p&1) ans=ans*temp; temp=temp*temp; p>>=1; } return ans; } int main() { //freopen("cin.txt","r",stdin); LL n,m; while(cin>>n>>m){ resolve(m); LL ans=0; for(int i=1;i<(1<<top);i++){ LL t=1,sum=0; for(int j=0;j<top;j++){ if(i&(1<<j)){ sum++; t=t*factor[j]; } } if(sum&1) ans+=power(m/t,n); else ans-=power(m/t,n); } printf("%lld\n",power(m,n)-ans); } return 0; }