Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 10309 | Accepted: 3566 |
Description
Input
Output
Sample Input
2006 1
2006 2
2006 3
Sample Output
1
3
5
Source
#include <cstdio> #include <cstring> #define ll long long int const MAX = 1e6 + 6; int fac[MAX]; int n, k, cnt; ll sum; void get_Factor(int x) { cnt = 0; for(int i = 2; i <= x; i++) { if(x % i == 0) fac[cnt ++] = i; while(x % i == 0) x /= i; } if(x > 1) fac[cnt ++] = x; } void DFS(int pos, int num, ll cur, ll x) { if(pos == cnt) { if(cur == 1) return; if(num & 1) sum += x / cur; else sum -= x / cur; return; } DFS(pos + 1, num, cur, x); DFS(pos + 1, num + 1, cur * fac[pos], x); return; } ll cal(ll mid) { sum = 0; DFS(0, 0, 1, mid); return sum; } int main() { while(scanf("%d %d", &n, &k) != EOF) { get_Factor(n); ll l = 0, r = 1e17, mid; while(l <= r) { mid = (l + r) >> 1; if(mid - cal(mid) < k) l = mid + 1; else r = mid - 1; } printf("%lld\n", l); } }
#include <cstdio> int const MAX = 1e6 + 5; int a[MAX]; int gcd(int a, int b) { while(b) { int tmp = a; a = b; b = tmp % b; } return a; } int main() { int m, k; while(scanf("%d %d", &m, &k) != EOF) { if(k == 1) { printf("1\n"); continue; } if(m == 1) { printf("%d\n", k); continue; } int cnt = 1; for(int i = 1; i <= m; i++) if(gcd(i, m) == 1) a[cnt ++] = i; cnt --; if(k % cnt == 0) printf("%d\n", (k / cnt - 1) * m + a[cnt]); else printf("%d\n", (k / cnt) * m + a[k % cnt]); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
POJ 2773 Happy 2006 (分解质因数+容斥+二分 或 欧几里德算法应用)
原文地址:http://blog.csdn.net/tc_to_top/article/details/47760517