POJ 2773 Happy 2006 (分解質因數+容斥+二分 或 歐幾里德演算法應用)
Happy 2006
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 10309 | Accepted: 3566 |
Description
Two positive integers are said to be relatively prime to each other if the Great Common Divisor (GCD) is 1. For instance, 1, 3, 5, 7, 9...are all relatively prime to 2006.
Now your job is easy: for the given integer m, find the K-th element which is relatively prime to m when these elements are sorted in ascending order.
Now your job is easy: for the given integer m, find the K-th element which is relatively prime to m when these elements are sorted in ascending order.
Input
The input contains multiple test cases. For each test case, it contains two integers m (1 <= m <= 1000000), K (1 <= K <= 100000000).
Output
Output the K-th element in a single line.
Sample Input
2006 1
2006 2
2006 3
Sample Output
1
3
5
Source
POJ Monthly--2006.03.26,static
題目連結:http://poj.org/problem?id=2773
題目大意:求第k個與m互質的數
題目分析:兩種方法,主流方法是分解質因數+二分+容斥,0ms過,先對m分解質因數,然後二分,二分時用容斥計算1到當前數字與m不互質的數的個數,然後用m減,就是與m互質的數的個數。
第二種方法利用了歐幾里德演算法,gcd(a, b) = gcd(b, a % b),令a = km + i,b = m則有:
gcd(km + i, m) = gcd(i, m),說明與m互質的數對m取模有周期性,因此設小於m且與m互質的數有cnt個,第i個為ai,則第m*cnt+i個為m*cnt+ai,其次要注意k整除cnt的時候,取到的實際上是a[cnt]而不是a[0],這個方法跑了2400ms+
題目連結:http://poj.org/problem?id=2773
題目大意:求第k個與m互質的數
題目分析:兩種方法,主流方法是分解質因數+二分+容斥,0ms過,先對m分解質因數,然後二分,二分時用容斥計算1到當前數字與m不互質的數的個數,然後用m減,就是與m互質的數的個數。
#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);
}
}
第二種方法利用了歐幾里德演算法,gcd(a, b) = gcd(b, a % b),令a = km + i,b = m則有:
gcd(km + i, m) = gcd(i, m),說明與m互質的數對m取模有周期性,因此設小於m且與m互質的數有cnt個,第i個為ai,則第m*cnt+i個為m*cnt+ai,其次要注意k整除cnt的時候,取到的實際上是a[cnt]而不是a[0],這個方法跑了2400ms+
#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 (二分答案+容斥)APP
- HDU 4135 Co-prime(容斥原理+分解質因數)
- POJ1142 Smith Numbers(數論,分治+暴力,質因數分解)MIT
- 階乘質因數分解
- 【快速因數分解】Pollard's Rho 演算法演算法
- 藍橋杯題庫 BASIC-16 分解質因數
- 因數分解演算法、週期查詢演算法(簡化)演算法
- POJ 3904 Sky Code (容斥+莫比烏斯反演)
- python將輸入的一個正整數分解質因數(map)Python
- 質數判斷、質因子分解、質數篩
- 大質數分解模板
- Java分解質因數,如輸入8,輸出8=2*2*2Java
- HDU 1299 Diophantus of Alexandria (公式變形 分解質因數)公式
- 容斥原理——數學知識
- #19. 計數(容斥原理)
- 容斥
- P1075 [NOIP2012 普及組] 質因數分解
- 反射容斥反射
- 容斥原理
- 求最大質因數
- Codeforces 893E Counting Arrays:dp + 線性篩 + 分解質因數 + 組合數結論
- POJ 2115-C Looooops-擴充套件歐幾里德演算法OOP套件演算法
- 【模板】容斥原理
- UVA 10892 LCM Cardinality (分解因數+暴力)
- 分解質因數——MOOC《零基礎學Java語言》第7周程式設計題1Java程式設計
- 容斥原理講解
- Min-Max 容斥
- lg容斥與反演
- bzoj 2655: calc [容斥原理 伯努利數]
- 【總結】理解歐幾里德及擴充套件歐幾里德演算法套件演算法
- (演算法)求1到1億間的質數或素數演算法
- POJ 1325-Machine Schedule(二分圖匹配-匈牙利演算法)Mac演算法
- poj2400 KM演算法二分圖的完美匹配演算法
- 南沙信奧塞陳老師解一本通題:2032:【例4.18】分解質因數
- 線性蒙皮分解演算法及其在遊戲中的應用演算法遊戲
- C Looooops(poj2115+擴充套件歐幾里德)OOP套件
- 遊戲裡面的容斥原理遊戲
- 尤拉計劃433題:歐幾里德演算法的步數演算法