再编号

链接:https://www.nowcoder.com/acm/contest/158/C
来源:牛客网
 

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

推一下前几项即可:第i项可表示为t*sum(+或-)a[i](sum为数列和)

第i次:

t1为前一项的sum的系数

如果i为偶数t=t1*(n-1)-1

如果是奇数t=t1*(n-1)+1

#include <bits/stdc++.h>
using namespace std;
#define mod 1000000007
int a[100010];
long long c[100010];
int main(){
    int n,m;
    c[0]=0;
    c[1]=1;
    scanf("%d %d",&n,&m);
    for(int i=2;i<=100000;i++){
        if(i%2==0){
            c[i]=((n-1)*c[i-1]-1+mod)%mod;
        }
        else{
            c[i]=((n-1)*c[i-1]+1+mod)%mod;
        }
    }
    long long sum=0;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        sum+=a[i];
    }
    sum%=mod;
    int x,y;
    while(m--){
        scanf("%d %d",&x,&y);
        if(y%2==0)
            printf("%lld\n",(sum*c[y]+a[x]+mod)%mod);
        else
            printf("%lld\n",(sum*c[y]-a[x]+mod)%mod);
    }
}

猜你喜欢

转载自blog.csdn.net/doublekillyeye/article/details/82080700