您的位置:首页 > 其它

BOJ 2773 第K个与m互质的数

2013-08-20 11:10 169 查看
算法是关键,得出1-m内的互质数,然后类推计算即可。下面有详细说明。

#include<iostream>
#include<cstring>
using namespace std;
int a[1000001];int p[1000000];   //用a来筛去m的唯一分解后的质因子及其倍数。
int main()
{
int m,k;
while(cin>>m>>k)
{
memset(a,0,sizeof(a));
memset(p,0,sizeof(p));
int mm=m;
for(int i=2;i<=mm;i++)     //此处mm即可
{
if(mm%i==0)
{
for(int j=i;j<=m;j+=i)  //筛去
a[j]=1;
while(mm%i==0)mm/=i;    //除掉
}
}
int t=1;      //t记录有多少个,
for(int i=1;i<=m;i++)
{
if(a[i]==0)p[t++]=i;        //p[i]记录第i个互质数(1--m)
}
t--;                           //1--m内有t个,那么m--2m,2m--3m....必然也有t个!每层相差m。
if(k%t==0)cout<<p[t]+m*(k/t-1)<<endl;//考虑特殊位子。
else cout<<m*(k/t)+p[k%t]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: