設f(n)=∑i=1niσ0(i)f(n) = \sum\limits_{i = 1} ^{n} i \sigma_0(i)f(n)=i=1∑n?iσ0?(i)。 ∑i=1ni∑d∣i∑d=1n∑i=1ndi×d∑d=1nd(nd+1)nd2\sum_{i = 1} ^{n} i \sum_{d \mid i}\\ \sum_{d = 1} ^{n} \sum_{i = 1} ^{\frac{n}ze8trgl8bvbq} i \times d\\ \sum_{d = 1} ^{n} d \frac{ (\frac{n}ze8trgl8bvbq + 1) \frac{n}ze8trgl8bvbq}{2} i=1∑n?id∣i∑?d=1∑n?i=1∑dn??i×dd=1∑n?d2(dn?+1)dn??
#include<bits/stdc++.h>usingnamespace std;constint N =1e6+10;int f[N], num[N], phi[N], prime[N], primes[N], cnt;bool st[N];int n, m, p, mod;inlineintadd(int x,int y){return x + y < mod ? x + y : x + y - mod;}inlineintsub(int x,int y){return x >= y ? x - y : x - y + mod;}voidinit(){f[1]= phi[1]=1;for(int i =2; i < N; i++){if(!st[i]){prime[++cnt]= i;phi[i]= i -1;f[i]=2;num[i]=1;primes[i]= i;}for(int j =1; j <= cnt &&1ll* i * prime[j]< N; j++){st[i * prime[j]]=1;if(i % prime[j]==0){phi[i * prime[j]]= phi[i]* prime[j];f[i * prime[j]]= f[i / primes[i]]*(num[i]+2);num[i * prime[j]]= num[i]+1;primes[i * prime[j]]= primes[i]* prime[j];break;}phi[i * prime[j]]= phi[i]*(prime[j]-1);f[i * prime[j]]= f[i]*2;num[i * prime[j]]=1;primes[i * prime[j]]= prime[j];}}for(int i =1; i < N; i++){phi[i]=add(phi[i], phi[i -1]);f[i]=add(1ll* i * f[i]% mod, f[i -1]);}}unordered_map<int,int> Phi;intDjs_phi(int n){if(n < N){return phi[n];}if(Phi.count(n)){return Phi[n];}int ans =1ll* n *(n +1)/2% mod;for(int l =2, r; l <= n; l = r +1){r = n /(n / l);ans =sub(ans,Djs_phi(n / l)*(r - l +1)% mod);}return Phi[n]= ans;}unordered_map<int,int> f1;intcalc1(int l,int r){return1ll*(l + r)*(r - l +1)/2% mod;}intF(int n){if(n < N){return f[n];}if(f1.count(n)){return f1[n];}int ans =0;for(int l =1, r; l <= n; l = r +1){r = n /(n / l);ans =add(ans,1ll*(n / l)*(n / l +1)/2% mod *calc1(l, r)% mod);}return f1[n]= ans;}intcalc(int n){returnsub(2ll*Djs_phi(n)% mod,1);}intquick_pow(int a,int n){int ans =1;while(n){if(n &1){ans =1ll* ans * a % p;}n >>=1;a =1ll* a * a % p;}return ans;}intmain(){// freopen("in.txt", "r", stdin);// freopen("ou.txt", "w", stdout);scanf("%d %d %d",&n,&m,&p);mod = p -1;init();int ans =0;for(int l =1, r; l <= n; l = r +1){r = n /(n / l);ans =add(ans,1ll*sub(F(r),F(l -1))*calc(n / l)% mod);}printf("%d\n",quick_pow(m, ans));return0;}