Codeforces - 1295D 歐拉函數 and Codeforces - 1270C 構造

<Codeforces - 1295D> 歐拉函數

http://codeforces.com/contest/1295/problem/D

題意:

給出a和m,在[0,m)內選一個x,滿足gcd(a, m) = gcd(a + x, m),問x取值有多少種。

思路:

設g = gcd(a, m)
令a = xg, m = yg
題設gcd(xg, yg) = (xg + z, yg)
易知z∈[0, m)爲g的倍數, 令z = kg, k∈[0, y)
即gcd(xg, yg) = gcd((x + k)g, yg)
則滿足所有gcd(x + k, y) = 1且∈[0, y)的k都可以
即求[x, x + y)中與y互質的元素個數
將區間[x, x + y)分解爲I1 = [x, y], I2 = (y, x + y)
所求即爲I1, I2中與y互質的元素總數
而gcd(x, y) = gcd(y, x % y)
又x < y, k < y, x + k < 2y, 故(x + k) % y = x + k - y
因此x + k∈I2時, gcd(x + k, y) = gcd(y, x + k - y), (x + k - y)∈(0, x)
故I2中與y互質的元素個數與I2' = (0, x)中與y互質的元素個數相等
所求即爲I1 = [x, y], I2' = (0, x)與y互質的元素總數
即[1, y]中與y互質的元素個數(歐拉函數)

AC代碼:

<Codeforces - 1270C> 構造

http://codeforces.com/contest/1270/problem/C

題意:

給定n個數,在這n個數內最多添加3個數(也可不添加),使得新的這些數的和是他們異或和的2倍,打印添加的個數與添加的值。

思路:

先附加xor的值,這樣sum = sum + xor,xor = xor ^ xor = 0;

再附加sum + xor,這樣sum = 2 * (sum + xor),xor = 0 ^ (sum + xor) = sum + xor

即sum = 2 * xor,構造完畢。

AC代碼:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章