題意:
翻譯成漢語,大概意思就是首先輸入乙個數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...