NC17375. 再编号
描述
输入描述
第一行 2 个数 n,m ,表示人数和询问次数;
接下来一行 n 个数,表示 ai ;
接下来 m 行,每行 2 个数 x,t ,描述一次询问。
输出描述
m 行,第 i 行 1 个数表示第 i 次询问的答案对 109+7 取模的结果。
示例1
输入:
4 3 1 2 3 4 1 0 2 2 4 1
输出:
1 22 6
说明:
初始编号:1 2 3 4C++(g++ 7.5.0) 解法, 执行用时: 27ms, 内存消耗: 1660K, 提交时间: 2023-05-14 14:22:14
#include<bits/stdc++.h> using namespace std; typedef long long s64; #define rep(i,l,r) for(int i=l;i<=r;++i) const int N=1e5+5,D=1e9+7; int a[N]; s64 sum[N]; int main() { //freopen("1.in","r",stdin); int n,m; cin>>n>>m; rep(i,1,n)scanf("%d",a+i); int sum0=0; rep(i,1,n)(sum0+=a[i])%=D; s64 q=-(n-1),x=1; sum[0]=x; rep(i,1,N-1) { x=x*q%D; sum[i]=(sum[i-1]+x)%D; } while(m--) { int x,t; scanf("%d%d",&x,&t); printf("%d\n",int(((-sum[t-1]*sum0+a[x])*(t%2?-1:1)%D+D)%D)); } }
C++11(clang++ 3.9) 解法, 执行用时: 30ms, 内存消耗: 1772K, 提交时间: 2018-08-24 20:27:32
#include <bits/stdc++.h> #define fo(i,a,b) for(i=a;i<=b;i++) using namespace std; typedef long long ll; const int N=1e5+1; const ll mo=1e9+7; int i,j,t,n,m,a[N]; ll x,s,tf[N],sum; int main() { scanf("%d%d",&n,&m); tf[1]=1; x=n-1; s=1; fo(i,2,N-1) { s=s*x%mo; tf[i]=(s-tf[i-1]+mo)%mo; } fo(i,1,n) scanf("%d",&a[i]), sum=(sum+a[i])%mo; fo(i,1,m) { scanf("%lld%d",&x,&t); s=(t&1 ? -a[x] : a[x]); printf("%lld\n",(tf[t]*sum%mo+s+mo)%mo); } }
Python3 解法, 执行用时: 246ms, 内存消耗: 15976K, 提交时间: 2022-06-02 20:47:58
n,m = map(int,input().split()) l = [int(x) for x in input().split()] l1= [l[0]] su = sum(l) for i in range(1,100001): l1.append((su-l1[i-1])%(10**9+7)) su *= n-1 su = su%(10**9+7) while m: x,t = map(int,input().split()) print(int((l1[t]+(-1)**t*(l[x-1]-l[0]))%(10**9+7))) m -= 1