列表

详情


NC17375. 再编号

描述

n 个人,每个人有一个编号 ai

定义对 a 的再编号为 a' ,满足

现在有 m 次询问,每次给定 x,t ,表示询问经过 t 次再编号后第 x 个人的编号。

由于答案可能很大,所以对 109+7 取模。

输入描述

第一行 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 4

1 次再编号后:9 8 7 6

2 次再编号后:21 22 23 24

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(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

上一题