题意:找和m互质的第k个数。
容斥原理可以快速求出某个范围内,和m不互斥的个数,显然可以求出某个范围内互质的个数,所以只要取一个很大的end,二分即可,写二分的时候开始按普通的写的,发现不对,要找第一个出现的数才是结果,取end和容斥的模版敲错一点,查数据查出了错,4Y。
1 #include2 #include 3 #include 4 using namespace std; 5 #define ll __int64 6 int prim[1001]; 7 ll judge(ll x,int len)//容斥求出1-x范围内和m的互质的个数 8 { 9 int i,j,cat;10 ll tem,ans = 0;11 for(i = 1;i < 1< <= len-1;j ++)16 {17 if(i&(1< <= num;i ++)43 {44 if(m%i == 0)45 {46 prim[len++] = i;47 while(m%i == 0)48 m = m/i;49 }50 if(m == 1) break;51 }52 if(m != 1) prim[len++] = m;53 str = 1;54 end = 1e13;//开始开小了55 while(str < end)56 {57 mid = (str+end)/2;58 ll key = judge(mid,len);59 if(key < k)60 str = mid+1;61 else62 end = mid;63 }64 printf("%I64d\n",str);65 }66 return 0;67 }