题目大意就是n个数,进行t次下列操作(sum为数列的和):
a[i]=sum-a[i]
sum = c[1] + c[2] + ... + c[n-1] + c[n];
a[t][i] = 处理 t 次后的c[i];
第t次:s[t] = a[t][1]+a[t][2]+a[t][3] + … + a[t][n]
a[t][i] = [ (n-1)^(t-1) – (n-1)^(t-2) + (n-1)^(t-3) - … (n-1) ^ 0 ] * cs + (-1)^t * c[i]
令 ns = (n-1)^(t-1) - (n-1)^(t-2) + (n-1)^(t-3) - (n-1)^(t-4) ... (n-1)^(0)
则 a[t][i] = ns * cs + (-1)^t * c[i]
求 ns 时,使用二分法,求等比数列的和。
再进行除法运算的时候若 a * c % m == 1 ,
则 b / a % m == ( b / a ) * ( a * c ) % m = b * c % m 。
#include<iostream>
using namespace std;
#define N 50009
#define M 98765431
typedef __int64 Int;
int c[N];
Int Pow(Int x,Int n)
{
x%=M;
if (n==0)
return 1;
if(n==1)
return x;
Int ans=Pow(x,n>>1);
if(n&1)
return ans*ans%M*x%M;
else
return ans*ans%M;
}
Int get_add(Int n,Int t)
{
Int qt=Pow(M+1-n,t);
Int nm=Pow(n,M-2);
Int tem=((M+1-qt)*nm)%M;
Int ans=((t&1)?tem:(M-tem));
return ans;
}
int main()
{
Int n,t,cs=0,ns;
cin>>n>>t;
for(int i=0;i<n;i++)
{
cin>>c[i];
cs=(c[i]+cs)%M;
}
if(n<2)
{
cout<<0<<endl;
return 0;
}
ns=get_add(n,t);
Int res=(ns*cs)%M;
if(t&1)
{
for(int i=0;i<n;i++)
cout<<(res+M-c[i])%M<<endl;
}
else
{
for(int i=0;i<n;i++)
cout<<(res+c[i])%M<<endl;
}
return 0;
}