Happy 2006
Time Limit: 3000MS | Memory Limit: 65536K |
---|
Description
Two positive integers are said to be relatively prime to each other if the Great Common Divisor (GCD) is 1. For instance, 1, 3, 5, 7, 9…are all relatively prime to 2006.
Now your job is easy: for the given integer m, find the K-th element which is relatively prime to m when these elements are sorted in ascending order.
Input
The input contains multiple test cases. For each test case, it contains two integers m (1 <= m <= 1000000), K (1 <= K <= 100000000).
Output
Output the K-th element in a single line.
Sample Input
2006 1
2006 2
2006 3
Sample Output
1
3
5
题意:如果两个数的gcd()==1,那么称这两个数是relatively prime(相对素数),一个数有许多个相对素数,求第k个
#gcd(at+b, a)==gcd(b,a),t∈R。
有一数m,m的相对素数中小于m的有k个,第i(i<=k)个数为ai,那么第cycm+i个相对素数就等于cyc*m+ai。
比如m=5,他的相对素数有:
1,2,3,4,6,7,8,9,11,12,13,14…,其中k=4。第6个数为(6/k)*m+a(6%k),第9个数为(9/k)*m+a(9%k),但第12个数为(12/k-1)*m+a(k-1),注意处理走整圈的情况。
cyc就相当于走了几圈,i相当于走了cyc圈还剩几步。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
int gcd(int a, int b)
{
return b==0 ? a:gcd(b, a%b);
}
int a[1000000], sum;
int main()
{
int m, k;
while(scanf("%d%d", &m, &k)!=EOF)
{
sum=0;
for(int i=1; i<=m; i++)
if(gcd(i, m)==1)
a[++sum]=i;
int cyc=k/sum, last=k%sum;
if(last==0)
printf("%d\n", (cyc-1)*m + a[sum]);
else
printf("%d\n", cyc*m+a[last]);
}
return 0;
}