HDU6265狄利克雷卷積

2021-08-29 02:01:51 字數 1842 閱讀 7571

題意:

​ 翻譯成漢語,大概意思就是首先輸入乙個數t代表有t組樣例,每組樣例第一行m代表有m對(其中p為素數,每對中的p各不相同),計算得到全部pi^qi的乘積n,最後求一下∑d|n φ(d) × n / d的值取模998244353

思路:​ 由於p和q資料範圍是1e8,我們沒辦法求出全部p^q的乘積n(爆long long),只能想辦法化簡公式和通過中間過程來得到答案,又因為給出的∑d|n φ(d) × n / d包含求和,我們遍歷辣麼大的數的求和鐵定超時,所以還應該想辦法把公式化簡成o(1)的,也就是把求和給去掉

​ 我們接著按照上面的需求想問題:

​ 令函式f(n) = n,令h(n) = ∑d|n φ(d) × n / d,是不是發現了點什麼!!!對,h(n)是φ(n)與f(n)的狄利克雷卷積。由於φ(n)是尤拉函式,所以它是積性函式,f(n) = n是單位函式,所以它是完全積性函式,那麼h(n)一定也是積性函式,它滿足a,b互質,則h(a * b) = h(a) * h(b)的性質

​ 又因為每對中的p都是不同的素數!!!因此每對pi^qi之間都是互質的,所以,我們就可以解決爆long long 問題:

h(n) = h(p1^q1 * p2^q2 * ... * pm^qm) = ∏ h(pi ^ qi)  //i為從1~m
​ 這樣我們從求h(n)變成了求m個h(pi^qi)的乘積了

​ 此時pi^qi也會爆long long,我們先別管繼續往下走

​ 這時候∑d|n φ(d) × n / d就變成了求∑d|p^q φ(d) × p^q / d .我們需要通過化簡∑d|p^q φ(d) × p^q / d為o(1)來解決超時問題,怎麼化簡呢?手寫了乙份化簡過程:

我們就可以把h(p^q) = ∑d|p^q φ(d) × p^q / d 化簡為h(p^q) = p^q + q * p^(q - 1) * (p - 1)

​ 這樣我們就可以通過h(n) = ∏ h(pi ^ qi)來求h(n)了(通過不斷的取餘998244353來防治爆longlong)

​ over~

**:

#include #include #include #define ll int64_t

#define d int32_t

#define f double

#define r return

#define mod 998244353

#define mem(a) memset(a, 0, sizeof(a))

#define scanfd(a) scanf("%d", &a)

#define scanfl(a) scanf("%lld", &a)

#define printfl(a) printf("%lld\n", a)

#define for(i, star, endd) for (d i = star; i <= endd; i++)

#define forr(i, endd, star) for (d i = endd; i >= star; i--)

//快速冪

ll quick(ll a, ll b)

b >>= 1;

a = a * a % mod;

}r ans;

}d main ()

printfl(ans);

}r 0;

}

如果有寫的不對或者不全面的地方 可通過主頁的****進行指正,謝謝

狄利克雷卷積 狄利克雷卷積學習筆記

前置知識 1 常見的完全積性函式 恒等函式 i i n 1 單位函式 id id n n 元函式 epsilon epsilon n n 1 元函式卷積任何函式 f 都是 f 本身 2 常見積性函式 尤拉函式 varphi n 是小於n和n互質的自然數個數 莫比烏斯函式 mu n sigma sig...

狄利克雷卷積

積性函式 f 和 g 狄利克雷卷積的形式 f ast g n sum limits f d g frac 或者 f ast g n sum limits f i g j 它滿足證明 f ast g ast h sum limits sum limits f d g frac h frac 等同於 f...

狄利克雷卷積

狄利克雷卷積 是定義在數論函式間的一種二元運算,可以定義為 f g n sum limits f x g y 或 f g n sum limits f d g frac 若 f,g 均為積性函式,則 f g 也是積性函式。顯然 f g 1 f 1 g 1 1 設 n perp m 則 begin f...