链接:
每变化一次,tot=tot*(n-1),且每两个数之差delta*=-1,直接根据这两个性质暴力循环100000次找到答案即可。
代码:
1 #include2 #include 3 #include 4 #include 5 #define int long long 6 using namespace std; 7 const int N=1e5+5,mod=1e9+7; 8 int n,m,a[N],sum,b[N]; 9 inline int read()10 {11 int x=0,w=1;12 char c=getchar();13 while (!isdigit(c)&&c!='-') c=getchar();14 if (c=='-') c=getchar(),w=-1;15 while (isdigit(c))16 {17 x=(x<<1)+(x<<3)+c-'0';18 c=getchar();19 }20 return x*w;21 }22 #undef int23 int main()24 {25 #define int long long26 n=read(),m=read();27 for (int i=1;i<=n;i++)28 {29 a[i]=read(); sum=(sum+a[i])%mod;30 }31 b[2]=n-2;32 for (int i=3;i<=100000;i++)33 {34 b[i]=1ll*(n-1)*b[i-1]%mod;35 if (i&1) b[i]=(b[i]+1)%mod;36 else b[i]=(b[i]-1+mod)%mod;37 }38 while (m--)39 {40 int x=read(),t=read();41 if (!t) {printf("%lld\n",a[x]); continue;}42 if (t==1) {printf("%lld\n",(sum-a[x]+mod)%mod); continue;}43 if (t==2) {printf("%lld\n",1ll*(n-2)*sum%mod+a[x]%mod); continue;}44 int ans=b[t]; ans=ans*sum%mod;45 if (t&1) ans=(ans-a[x]+mod)%mod; else ans=(ans+a[x])%mod;46 printf("%lld\n",ans);47 }48 return 0;49 }