poj 2773 Happy 2006(数论:欧拉函数)
来源:互联网 发布:熊猫看书软件 编辑:程序博客网 时间:2024/06/05 19:28
给出n, k,输出与n互质的第k个正整数
这个题归根结底用到了一个性质:
gcd(a, b) == gcd(a, b+a*t) (t=0,1,2...)
所以一种方法就是找到小于n且与n互质的所有数prime[]以及其个数cnt
如果k<tot,则直接输出
否则根据上式可知存在循环节,相邻两个循环节之间相差:k/cnt*m
所以结果应该为:k/cnt*m+prime[k%(cnt-1)]
但是还要考虑一种情况k%cnt == 0
此时结果应该为:(k/cnt-1)*m+prime[cnt-1];
暴力求素数2407打表代码如下:
#include <cstdio>#include <iostream>#define MAXN 1001000using namespace std;int prime[MAXN];int gcd(int a, int b) { return b ? gcd(b, a%b) : a;}int main(void) { int m, k, i, cnt; while(scanf("%d%d", &m, &k) != EOF) { cnt = 0; for(i=1; i<=m; ++i) if(gcd(m, i) == 1) prime[cnt++] = i; if(k % cnt) cout << k/cnt*m+prime[k%cnt-1] << endl; else cout << (k/cnt-1)*m+prime[cnt-1] << endl; } return 0;}
而上面用到了求n以内与n互质的数以及个数
所以很容易想到用欧拉函数
这个题用欧拉函数要快的多得多
16ms代码如下:
#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#define MAXN 1001000using namespace std;int prime[MAXN];bool vis[MAXN];int euler_phi(int n) { int m, cnt, ans, tmp; m = sqrt(n+0.5); cnt = 0; ans = tmp = n; for(int i=2; i<=m; ++i) { if(n%i == 0) { prime[cnt++] = i; ans = ans/i*(i-1); n /= i; while(n%i == 0) n /= i; for(int j=i; j<=tmp; j+=i) vis[j] = true; } } if(n > 1) { ans = ans/n*(n-1); for(int j=n; j<=tmp; j+=n) vis[j] = true; } return ans;}int get(int n) { int cnt = 0; for(int i=1; i<MAXN; ++i) { if(!vis[i]) ++cnt; if(cnt == n) return i; }}int main(void) { int m, k; while(scanf("%d%d", &m, &k) != EOF) { if(m==1) { printf("%d\n", k); continue; } memset(vis, 0, sizeof(vis)); int ans = euler_phi(m); int n = (k-1)%ans+1; printf("%d\n", (k-1)/ans*m+get(n)); } return 0;}
0 0
- poj 2773 Happy 2006(数论:欧拉函数)
- POJ 2773 Happy 2006 欧拉函数
- POJ 2773-Happy 2006(欧拉函数)
- POJ 2773 Happy 2006 欧拉函数的应用
- poj 2773 Happy 2006(欧拉函数应用)
- POJ 2773 Happy 2006(数论)
- POJ 2773 Happy 2006 二分 and 容斥原理 or 欧拉函数
- POJ 2773 Happy 2006 【gcd的性质(也可用欧拉函数)】
- poj 2407Relatives(数论:欧拉函数)
- POJ 2723 Happy 2006 欧拉应用
- 2773 Happy 2006 //欧拉函数的应用
- (Relax 1.15)POJ 2773 Happy 2006(欧拉函数的应用:求与n互质的第k个数)
- POJ 2773 Happy 2006(求第k个和m互素的数/欧拉函数)
- POJ 2773 Happy 2006 【数论,容斥原理+二分】
- 数论欧拉函数
- 欧拉函数(数论)
- 数论-欧拉函数
- 欧拉函数---数论
- Visual Studio (2010)上手
- 指针作为函数的参数
- javascript基础
- MFC编程集锦
- 单播,组播和广播
- poj 2773 Happy 2006(数论:欧拉函数)
- STM32单片机学习(13) I2C读写AT24Cxx存储器实验
- Maven实战(九)——打包的技巧
- HDU 4964 Emmet
- 基于java调用https接口
- Entity Framework 5.0 Code First全面学习
- java的(String)字符串方法
- nginx模块编译错误
- hdu 4970 Killing Monsters 【树状数组(区间修改,点查询)】