链接:https://www.nowcoder.com/acm/contest/158/C
每变化一次,tot=tot*(n-1),且每两个数之差delta*=-1,直接根据这两个性质暴力循环100000次找到答案即可。
代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<cctype> 4 #include<algorithm> 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 int 23 int main() 24 { 25 #define int long long 26 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 }