Happy 2006
一个是阆苑仙葩,一个是美玉无瑕。
若说没奇缘,今生偏又遇着他;
若说有奇缘,如何心事终虚化?
一个枉自嗟呀,一个空劳牵挂。
一个是水中月,一个是镜中花。
想眼中能有多少泪珠儿,怎禁得秋流到冬尽,春流到夏~~~!
林黛玉被牛魔王抓走了,诸葛亮告诉贾宝玉,林黛玉被藏到了梁山上的某个房间中,我们知道梁山上有非常多的房间,那么林黛玉在那个呢,我们知道林黛玉和贾宝玉之间有心灵感应,所以宝玉收到了来自林黛玉的呼救,但由于林黛玉的流量都拿去看世界杯了,再加上荒山野岭没有4G网,所以发送的信息有些残缺,但这难不到贾宝玉,他从残缺的信息中破译到两个关键信息,‘m’和‘k’,‘m’是‘影响因子’假设林黛玉所在的房间编号为a,则gcd(a,m)一定为1,k是序列号,表示若将房间按编号从小到大排序,则林黛玉所在的房间前一定有k-1个满足上个条件的房间。虽然贾宝玉成功找到了救出林黛玉的方法,但牛魔王也不是吃素的,每当贾宝玉成功找到林黛玉,牛魔王就会将林黛玉转移到一个新的房间,但林黛玉也会发出新的求救信息。但牛魔王的法力也有限,这意味着,只要不停计算下去,直到文件结束,就一定能够救出林黛玉。然而,由于贾宝玉在参加ACM集训的时候只顾着打炉石传说了,所以他并不知道该如何计算,你能够帮帮他吗?
Input
输入包含多组数据 每组数据包含两个数m,k。 (1 <= m <= 1000000), K (1 <= K <= 100000000).
Output
对于每组数据,输出一行,林黛玉所在的房间编号
Sample Input
2018 1
2018 2
2018 3
Sample Output
1
3
5
题意:就是找第k个与他互质的数,这个k可能很大
思路:有一个性质,就是好比说前m个数中与m互质的数有k个把,那么m~2m中与m互质的数也有k个,所以说咱们只需要判断在哪个区间内,然后mod那个phi(i)是几就行,具体看代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 1000010;
bool prime[N];
int eluar(int n){
int m = n,ans = n;
for(int i=2;i*i<=n;i++){
if(n % i == 0){
ans = ans / i * (i-1);
while(n % i == 0) n /= i;
for(int j=1;j*i<=m;j++) prime[j*i] = true;
}
}
if(n > 1){
ans = ans / n * (n-1);
for(int j=1;j*n<=m;j++) prime[j*n] = true;
}
return ans;
}
int main(){
int m,k;
while(cin>>m>>k){
memset(prime,0,sizeof prime);
int cnt = eluar(m);
int t = k / cnt;
if(k % cnt == 0) t--;//这个地方一定要注意,就是不能先k %= cnt , 因为当m = k = 1 ,时,最后
k -= cnt * t;//先k %= cnt = 0 , 那么那个i是从2那边出来的,所以答案不正确,一定要先判断再减
int sum = 0,i;
for(i=1;i<=m;i++){
if(!prime[i]) sum ++;
if(sum == k) break;
}
cout<<t*m+i<<endl;
}
return 0;
}