Happy 2006
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 12662 | Accepted: 4456 |
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.
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
题意:给出一个m,一个k,求出第k个与m互质的数。
思路:若gcd(a,b)==1,则易知gcd(a,a*t+b)==1,所以比m小的数中与m互质的数的个数就是一个周期内与m互质的数的个数(一个周期指的是m*t~m*(t+1)),由此就可以求出第一个周期内与m互质的数就可以,根据k的值来计算答案。
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int m,k;
int pri[1000005];
int gcd(int a,int b)
{
if(b==0)return a;
return gcd(b,a%b);
}
int main()
{
while(cin>>m>>k)
{
memset(pri,0,sizeof(pri));
int cnt=0;
for(int i=1;i<=m;i++)
{
if(gcd(m,i)==1)
{
pri[++cnt]=i;
}
}
if ( k%cnt != 0)
cout<<m*(k/cnt)+pri[k%cnt]<<endl;
else
cout<<m*(k/cnt-1)+pri[cnt]<<endl;
}
}