POJ 2773 Happy 2006(数论)
2015-09-04 08:29
337 查看
Description
给出n和k求第k个与n互素的数
Input
多组输入,每组用例占一行包括两个整数n和k,以文件尾结束输入
Output
对于每组用例,输出第k个与n互素的数
Sample Input
2006 1
2006 2
2006 3
Sample Output
1
3
5
Solution
由gcd(a,b)=gcd(a+k*b,b)得如果a和b互素,那么a+k*b和b也互素,如果a+k*b与b不互素,那么a和b也不互素,所以所有与n互素的数对n有周期性,那么只要求出所有小于n且与n互素的数就能求出第k个与n互素的数
Code
给出n和k求第k个与n互素的数
Input
多组输入,每组用例占一行包括两个整数n和k,以文件尾结束输入
Output
对于每组用例,输出第k个与n互素的数
Sample Input
2006 1
2006 2
2006 3
Sample Output
1
3
5
Solution
由gcd(a,b)=gcd(a+k*b,b)得如果a和b互素,那么a+k*b和b也互素,如果a+k*b与b不互素,那么a和b也不互素,所以所有与n互素的数对n有周期性,那么只要求出所有小于n且与n互素的数就能求出第k个与n互素的数
Code
#include<cstdio> #include<iostream> using namespace std; #define maxn 1000000 typedef long long ll; int prime[maxn]; int gcd(int a,int b) { if(b==0) return a; return gcd(b,a%b); } int main() { int n,k; while(~scanf("%d%d",&n,&k)) { int res=0; for(int i=1;i<=n;i++)//预处理出所有小于n且与n互素的数 if(gcd(n,i)==1) prime[res++]=i; if(k%res) cout<<k/res*n+prime[k%res-1]<<endl; else cout<<(k/res-1)*n+prime[res-1]<<endl; } return 0; }
相关文章推荐
- iOS播放音乐
- 从零开始学 iOS 开发的15条建议
- 基于第三方微信授权登录的iOS代码分析
- iOS 集合的深复制与浅复制
- 寒哥教你学iOS - 经验漫谈
- 开源分享 一(StickerCamera + 仿微信多图选择)
- Android test---robotium----简单例子
- Android应用的定时通知实现
- append()和appendTo()的区别
- UNITY 将函数加入队列,并依次执行队列里的函数
- Android 录音PCM 转G711U,非常简单,非FFMPEG
- swift 学习<五> String
- iOS 自定义Loading指示器
- Flume - Too many unapproved licenses: 1
- iOS开发脚踏实地学习day01-02-加法计算器和图片移动缩放旋转
- Android:Layout_weight的深刻理解
- Android:Layout_weight的深刻理解
- 安卓学习之路(二):app总览和Activity简介
- Android设计模式——装饰模式之ContexWrapper源码分析
- IOS 关键字self,super,copy,retain,assign,readonly,readwrite,nonatomic,@synthesize,@property,@dynamic(转载)