51Nod 1237 最大公約數之和 V3

2021-08-06 07:40:43 字數 1445 閱讀 9273

acm模版

發現 51no

d 上題號為

123∗

的幾個題連著都是杜教篩,儼然可以成為乙個模版搞搞了……但是我的數學水平實在有限,就算搞了模版怕是也無法靈活使用,所以想想也就算了。

其實早先我是不知道分塊具體是指什麼的,做了這幾道杜教篩的問題後,我算是搞明白這個,就是我們最後獲取的公式是乙個遞迴式,所以我們可以將整個問題劃分為兩部分,小的部分打表出來,而大的部分,可以依靠遞迴式來求解,當然,這也許只是我的乙個狹隘的認知,實在是對這些個概念懵懵懂懂的。la

tex 的公式寫的手抽筋兒,所以懶得再絮絮叨叨的寫一堆推導了,dance_in_the_dark』s blog 公式推導相當詳細,大牛說很容易就推出來了,這讓我這數學 zz

和公式恐懼症很尷尬啊……只能 or

z 一下了,希望有一天我也可以將自己的數學水平提高到不再畏懼~~~

#include 

#include

#define ll long long

using

namespace

std;

const

int maxn = 1e6 + 5;

const

int mod = 1e9 + 7;

const

int inv_2 = 5e8 + 4;

ll pri[maxn];

ll vis[maxn];

ll phi[maxn];

ll h[maxn * 10];

ll f[maxn * 10];

ll n, ans;

int hash_(ll x)

return t;

}ll gphi(ll n)

ll x = hash_(n);

if (h[x])

ll t = n % mod;

ll k = t * (t + 1) % mod * inv_2 % mod;

for (ll i = 2; i <= n; i = t + 1)

k = (k % mod + mod) % mod;

h[x] = n;

f[x] = k;

return k;

}void init()

for (int j = 1; j <= pri[0]; j++)

vis[i * pri[j]] = 1;

if (i % pri[j] == 0)

else}}

for (int i = 1; i <= maxn; i++)

}int main()

printf("%lld\n", ans);

return

0;}

51nod 最大的最大公約數

這道題挺有意思,讓求最大的兩兩最大公約數,很顯然暴力直接做複雜度太高。可以利用試除法,列舉每乙個數的因子,如果某個因子出現超過了兩次,就可以進行判斷,因為題目要求兩兩。最大公約數一定是某個數的因子。include includeusing namespace std int cnt 50005 an...

51nod 1040 最大公約數之和

1040 最大公約數之和 rihkddd 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 給出乙個n,求1 n這n個數,同n的最大公約數的和。比如 n 6 1,2,3,4,5,6 同6的最大公約數分別為1,2,3,2,1,6,加在一起 15 input 1個數n ...

51nod1040最大公約數之和

題目大意 給出乙個n,求1 n這n個數,同n的最大公約數的和。比如 n 6 1,2,3,4,5,6 同6的最大公約數分別為1,2,3,2,1,6,加在一起 15 input 1個數n n 10 9 output 公約數之和 思路 將n分解質因子,每個質因子貢獻的是多少,累加求和。每個質因子貢獻的次數...