P2671 [NOIP2015 普及组] 求和

题目描述

一条狭长的纸带被均匀划分出了n个格子,格子编号从1到n。每个格子上都染了一种颜色colori​用[1,m]当中的一个整数表示),并且写了一个数字number_i​。

定义一种特殊的三元组:(x,y,z),其中x,y,z都代表纸带上格子的编号,这里的三元组要求满足以下两个条件:

  1. xyz是整数,x<y<z,y-x=z-y

  2. colorx=colorz

满足上述条件的三元组的分数规定为(x+z)×(numberx​+numberz​)。整个纸带的分数规定为所有满足条件的三元组的分数的和。这个分数可能会很大,你只要输出整个纸带的分数除以10,007所得的余数即可。

输入格式

第一行是用一个空格隔开的两个正整数n和m,n表纸带上格子的个数,m表纸带上颜色的种类数。

第二行有n用空格隔开的正整数,第i数字number表纸带上编号为i格子上面写的数字。

第三行有n用空格隔开的正整数,第i数字color表纸带上编号为i格子染的颜色。

输出格式

一个整数,表示所求的纸带分数除以10007所得的余数。

输入输出样例

输入 #1复制

6 2
5 5 3 2 2 2
2 2 1 1 2 1

输出 #1复制

82

输入 #2复制

15 4
5 10 8 2 2 2 9 9 7 7 5 6 4 2 4
2 2 3 3 4 3 3 2 4 4 4 4 1 1 1

输出 #2复制

1388

说明/提示

解题类型:线性结构, 前缀和

解题思路:推出公式;

1)由x<y<z,y-x=z-y, 推出x+y=2*y  , 则x,y同奇同偶。

2)x , z颜色相同。 

3)(num_1 + num_2)*(i_1+i_2) + (num_1+num_3)*(i_1+i_3)+.....(num_n-1+num_n)*(i_n-1+i_n)

4)num_i*(i_1*(n-1)+ i_2+i_3+...i_n)+num_2*(i_1+i_2*(n-1)+i_3....)+.....num_n*(i_1+...i_n*(n-1))

5)(num_1+num_2+num3+....num_n)*(i_1+i_2+...i_n) + (num_1*i_1 + num_2*i_2...num_n*i_n)*(n-2)

6)ans = sum_num*sum_i + (n-2)*\sum_{1}^{n}(num_{i}*i_{i})

注意点:数据很大要模10007, 这里的n是指同种颜色且同奇偶的格子的个数,数字之和也应当是同种颜色且同奇偶的格子内数据之和。

AC代码:

#include <bits/stdc++.h>
#define MAXN 1e6+2
#define inf 0x3f3f3f3f
#define rep(x, a, b) for(int x=a; x<=b; x++)
#define per(x, a, b) for(int x=a; x>=b; x--)
using namespace std;
const int NC = 1e6+2;
int a[100002], b[100002];

//(num[1]+num[2]+num[3]...num[n])(i1+i2+i3...+in) + (num[1]*i1+num[2]*i2+num[3]*i3...num[n]*in)*(n-2)
//sum_i*(sum_num+ a[i] *(n-2));
int c[2][100002];
int cot[2][100002];
int main()
{
    int n, m;
    int ans = 0;
    scanf("%d%d", &n, &m);
    rep(i, 1, n)
    {
        scanf("%d", &a[i]);
    }
    rep(i, 1, n)
    {
        scanf("%d", &b[i]);
    }
    rep(i, 1, n)
    {
        c[i%2][b[i]] += a[i];//计算同一颜色且同奇同偶的格子内数据之和
        c[i%2][b[i]] %= 10007;
        cot[i%2][b[i]]++;//给同一颜色且同奇同偶的格子计数。
    }
    //sum_i*(sum_num+ a[i] *(n-2));
    rep(i, 1, n)
    {
        ans += (i*((c[i%2][b[i]]+a[i]*(cot[i%2][b[i]]-2))%10007))%10007;//防爆,多模几次
    }
    cout<<ans%10007;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_54674275/article/details/121319978