数列
我们计查分数列为$A$,$A[i]=a[i]-a[i-1]$
对于每一个差分序列,由于$(k-1)*m<n$,所以我们控制结尾那一位为n,移动首位,对答案的贡献为-->$n-\sum{A[i]}$
总共有$m^{k-1}$个差分数列,所以-->$ans=\sum...\sum\left(n-\sum{A[i]}\right)$
=$m^{k-1}*\left(n-\sum...\sum{A[i]}\right)$
总共有$m^{k-1}$个$A$数列,每个数列有$k-1$个数,所以总共有$(k-1)*m^{k-1}$个数,而这m个数出现的次数是一样的,所以每个数出现$(k-1)*m^{k-2}$次,所以总和为$(k-1)*m^{k-2}*((m+1)*m/2)$
$ans=m^{k-1}-(m+1)*m/2*(k-1)*m^{k-2}$
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 typedef long long i64; 5 i64 n,k,m,p; 6 7 i64 qp(i64 bs,i64 x){ 8 i64 sum=1LL; 9 while(x){ 10 if(x&1)sum=(sum*bs)%p; 11 bs=(bs*bs)%p; 12 x>>=1; 13 } 14 return sum; 15 } 16 int main(){ 17 scanf("%lld%lld%lld%lld",&n,&k,&m,&p); 18 i64 mi=qp(m,k-2); 19 i64 ans=(n%p*mi%p*m%p%p-(m+1)*m/2%p*mi%p*(k-1)%p+p)%p; 20 printf("%lld\n",ans); 21 return 0; 22 }