NOIP2015pj求和
2016-08-21 16:34
197 查看
题目描述
一条狭长的纸带被均匀划分出了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)+偶[b]*num*(cnt偶-2)[/b]
[b]预处理sum和cnt数组,然后扫一遍统计答案行了[/b]
[b]WARN:一定多%%%%%%%%%%%%[/b]
#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 ,num ,sum[2] ,cnt[2] ; 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; }
相关文章推荐
- [Noip2015PJ] 求和
- 洛谷P2671 NOIP2015普及组 T3 求和
- NOIP2015(普及组)T3 求和
- NOIp2015P 求和
- [NOIP2015普及组]求和
- [noip2015pj] 扫雷游戏
- noip2015pj t4
- [NOIP2015][CODEVS5131]求和(数学相关)
- 求和(NOIP2015)
- 【codevs 5131】[NOIP普及组 2015 T3]求和(递推)
- NOIP 2015 T3 普及组 求和 公式分解+线扫
- 洛谷P2671 NOIP2015普及组第三题 求和
- NOIP2015 PJ 4 salesman
- caioj 1362 NOIP2015普及组 第三题 求和
- [普及]NOIP 2015 求和
- [noip2002pj] 级数求和
- noip2015 第三题 求和 (取模运算)
- NOIP2015PJ T3,T4题解
- code vs 5131 求和 noip2015 (数学乱搞)
- ◆竞赛题目◆◇NOIP2015普及组◇求和