数列

我们计查分数列为$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 }
View Code

 

posted @ 2016-01-05 17:31  Ngshily  阅读(178)  评论(0编辑  收藏  举报