NOIP2015pj求和

题目描述

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

定义一种特殊的三元组:(x,y,z),其中x,y,z都代表纸带上格子的编号,这里的三元

组要求满足以下两个条件:

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

2.colorx=colorz

满足上述条件的三元组的分数规定为(x+z)*(number_x+number_z。整个纸带的分数

规定为所有满足条件的三元组的分数的和。这个分数可能会很大,你只要输出整个纸带的分数除以10,007所得的余数即可。

-------------------------------------------------------------------------------------------------------------------

需要一点数学推导,对于一种颜色,就是sigma奇*sigma num奇+sigma偶*sigma num偶+奇*num*(cnt奇-2)+偶*num*(cnt偶-2)

预处理sum和cnt数组,然后扫一遍统计答案行了

#include <iostream>
#include <cstdio>
using namespace std;
const int N=1e5+5,MOD=10007;
inline int read(){
    char c=getchar(); int x=0,f=1;
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
    return x*f;
}
int n,m,ans=0;
int col[N],num[N],sum[2][N],cnt[2][N];
int main(int argc, const char * argv[]) {
    n=read();m=read();
    for(int i=1;i<=n;i++) num[i]=read()%MOD;
    for(int i=1;i<=n;i++){
        col[i]=read();
        sum[i%2][col[i]]=(sum[i%2][col[i]]+num[i])%MOD;
        cnt[i%2][col[i]]++;
    }
    for(int i=1;i<=n;i++){
//        ans=(ans+(i%MOD*sum[i%2][col[i]])%MOD+(i%MOD*num[i]*(cnt[i%2][col[i]]-2)+MOD)%MOD)%MOD;
        ans=(ans+i%10007*((sum[i%2][col[i]]+(cnt[i%2][col[i]]-2)%10007*num[i]+10007)%10007))%10007;
    }
    cout<<ans;
    return 0;
}
时间: 2024-09-28 03:06:47

NOIP2015pj求和的相关文章

【Noip2015pj】求和

大佬们的题解都看不懂啊...果然还是太弱了呢.那么这里就给出一个自认为比较好理解的题解吧\(qwq\) 正文部分: 首先考虑部分分: \(10pts:O(n^3)\)枚举 \(40pts:O(n^2)\)枚举: 移项得知:\(2y=x+z\),那么对于\(x+z\)为偶数的时候,一定有\(y\)存在,否则相反,于是复杂度就降了一维: \(100pts:O(n)\) 同样继续\(40pts\)做法:将\(y\)移项: 那么原式就成了:\[x+z=2y\] 于是我们就可以讨论\(x\)与\(z\)的

cogs 36.求和问题

36. 求和问题 ★   输入文件:sum.in   输出文件:sum.out   简单对比时间限制:1.2 s   内存限制:128 MB [问题描述] 在一个长度为n的整数数列中取出连续的若干个数,并求它们的和. [输入格式] 输入由若干行组成,第一行有一个整数n    第二行有n个整数    第三行有一个整数m    下面m行,每行两个整数i与j(i<=j),表示求和的起始和终止位置. [输出格式] 输出有m行, 每行一个整数,表示这个数段数列的和. [输入样例] 输入文件 82 3 4

使用Linq求和方法Sum计算集合中多个元素和时应该注意的性能问题

提出问题 本文使用下面的实例来说明问题,以下是实例的完整代码. //************************************************************ // // Sum应用示例代码 // // Author:三五月儿 // // Date:2014/09/10 // // http://blog.csdn.net/yl2isoft // //**********************************************************

杭电 2015 偶数求和

http://acm.hdu.edu.cn/showproblem.php?pid=2015 偶数求和 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 45044    Accepted Submission(s): 19675 Problem Description 有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序

HDU4027 Can you answer these queries 线段树区间求和+剪枝

给了你n,然后n个数字在一个数组中,接下来m个询问,每个询问三个数字 t,x,y,若t==0,那么修改区间[x,y]的每一个值,变为原来每个位置上的数 开根号取整,若t==1,那么对区间[x,y]求和 由于n,m,很大,所以树状数组铁定超时,若直接用线段树来做区间修改,那么也是超时,这类题目没别的方法了,静心剪枝,发现题目给的数据范围为2^63,有没有发现,2^63开根号 绝对不需要开10次,就能到1,到1以后就不需要再开了,意思就是若有某个区间[x,y]每一个点的值都为1时,这一段区间事实上是

7.03 对某列的值求和

问题:计算某个列中所有值的和,例如,计算所有职员的工资总额.解决方案:如果将整个表作为一个组或一个窗口求和,则只需对相应列使用SUM函数,而不要使用GROUP BY 子句:select sum(sal) from emp 如果创建了多个数据组或多个窗口,则使用SUM函数的同时,还要使用GROUP BY子句.下面例子将按部门计算职员的工资总额:select deptno,sum(sal) as total_for_dept from emp group by deptno;

HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和)

HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意: g(i)=k*i+b;i为变量. 给出k,b,n,M,问( f(g(0)) + f(g(1)) + ... + f(g(n)) ) % M的值. 分析: 把斐波那契的矩阵带进去,会发现这个是个等比序列. 推倒: S(g(i)) = F(b) + F(b+k) + F(b+2k) + .... + F(b+nk) // 设 A = {1,1,

【noip】noip201503求和

3. 求和 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 题目描述 一条狭长的纸带被均匀划分出了n个格子,格子编号从1到n.每个格子上都染了一种颜色colori用[1,m]当中的一个整数表示),并且写了一个数字numberi. 5 5 3 2 2 2 编号 1 2 3 4 5 6 定义一种特殊的三元组:(x, y, z),其中x,y,z都代表纸带上格子的编号,这里的三元组要求满足以下两个条件: 组要求满足以下两个条件: 1.  xy

java课堂训练 参数求和

package demo; //20153173 Yulixiang 2016.9.20 public class CommandParameter {    public static void main(String[] args) {        System.out.println("the number:" +args.length);        int i,sum=0;        for(String arg:args){              i=Integ