标签:des style blog http io color os ar for
容斥原理入门题吧。
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 9798 | Accepted: 3341 |
Description
Input
Output
Sample Input
2006 1 2006 2 2006 3
Sample Output
1 3 5
Source
#include <iostream> #include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> #include <string> #include <queue> #include <stdlib.h> using namespace std; int m,k; int mark[1001000]; int save[1001000]; int pcnt; int g[100100]; long long int sum; int cnt; void getprime() { //1不是素数 for(int i=2;i<=1000000;i++) { if(mark[i]==1) continue; save[pcnt++]=i; for(int j=i;j<=1000000;j+=i) mark[j]=1; } } void dfs(int n,long long num,int s,long long int key) { if(n==0) { sum += key/num; return ; } if(s>=cnt) return ; for(int i=s;i<cnt;i++) { if(num*g[i]>key) continue; else dfs(n-1,num*g[i],i+1,key); } } long long int fuc(long long int x) { if(x==1) return 1; long long ans=0; int sign=0; for(int i=1;i<=cnt;i++) { sum=0; if(sign==0) { dfs(i,1,0,x); ans+=sum; } else { dfs(i,1,0,x); ans-=sum; } sign=sign^1; } return x-ans;//这里面应该不会出现负数吧 } int main() { getprime(); while(scanf("%d%d",&m,&k)!=EOF) { //然后就是分解一个数了 cnt=0; for(int i=2;i<=m;i++) { int flag=0; while(m%i==0) { if(flag==0) { g[cnt++]=i; } flag=1; m/=i; } } if(m!=1) g[cnt++]=m; //然后就是容斥原理 int b=0,d=1000000000; while(b<d) { int mid=(b+d)/2; int key=fuc(mid); if(key>=k) d=mid; else b=mid+1; } printf("%d\n",b); } return 0; }
标签:des style blog http io color os ar for
原文地址:http://www.cnblogs.com/chenhuan001/p/4060819.html