| 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