题解 P5011 【水の造题】
很显然每个数在求和时出现的次数相等,设
ans=d[n]*sum/k^n( mod 19491001)
试图递推
d[i]=k^{i-1}+2*k^{i-2}+d[i-1]*k
第一项
第二项
第三项
然后经过找规律归纳推理,可得
d[n]=n*k^{n-1}+2*(n-1)*k^{n-2}
代入进
ans=sum*(n*k+2*(n-1))/k^2
求出
Code
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
using namespace std;
typedef long long ll;
ll mod = 19491001;
int n;
char s[1000010];
int len;
ll N;
ll k;
ll tot;
ll quick_pow(ll x, int k) {
ll res = 1;
while(k) {
if(k & 1) res = res * x % mod;
x = x * x % mod;
k >>= 1;
}
return res;
}
ll inv(long long x) {
return quick_pow(x, mod - 2);
}
int main(){
char ch=getchar();
while(isdigit(ch)){
s[++len]=ch;
N=(10*N+ch-'0')%mod;
ch=getchar();
}
scanf("%lld",&k);
int i,val;
for(i=1;i<=k;i++){
scanf("%d",&val);
tot=(tot+val)%mod;
}
ll invk=inv(k);
printf("%d",(N*k%mod+2*N-2)%mod*tot%mod*invk%mod*invk%mod);
return 0;
}