20160802 求和 找规律
2016-08-08 19:00
267 查看
设位置为pos,数字为num,则每一个节点新加入时,与他前面的节点产生的贡献值,等于前面节点个数此pos此num+前面pos和此num+前面num和此pos+前面各num*pos的和。因此每加入一个节点,计算完新产生的贡献,就可以把它和前面的节点合到一起了。时间复杂度O(N)。
因为奇数位置上的点和偶数位置上的点不能合,所以要开两个数组。
自己的代码:
#include<cstdio> #define moder 10007 #define gm 100001 #define ck(x) if(x>=moder) x%=moder using namespace std; typedef unsigned long long ull; int n,m; int ni[gm],ci[gm]; ull ans; struct card { ull qtt; ull posn; ull numn; ull cs; card():qtt(0),posn(0),numn(0),cs(0){} }e[gm][2]; inline void merge(int col,int num,int pos) { card &t=pos&1?e[col][0]:e[col][1]; ck(num);ck(pos); ans+=(((t.qtt*num*pos)%moder)+((t.posn*num)%moder)+((t.numn*pos)%moder)+t.cs)%moder; ck(ans); t.qtt++; ck(t.qtt); t.posn+=pos; ck(t.posn); t.numn+=num; ck(t.numn); t.cs+=pos*num; ck(t.cs); } int main() { freopen("sum.in","r",stdin); freopen("sum.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&ni[i]); for(int i=1;i<=n;i++) scanf("%d",&ci[i]); for(int i=1;i<=n;i++) merge(ci[i],ni[i],i); printf("%llu",ans); return 0; }
相关文章推荐
- 分数序列规律求和
- zzulioj--1609--求和(数学规律)
- zzulioj--1609--求和(数学规律)
- UPC-6022 跳马(数列增量求和&广搜打表找规律)
- 【BZOJ】1677: [Usaco2005 Jan]Sumsets 求和(dp/规律)
- hdoj2015(java)偶数求和 (找规律,总结)常看
- 第三周C#上机实验(一)有规律的求和
- CodeForces 337C 找规律 ,等比数列求和
- HDU - 4790(规律求和)
- The ? 1 ? 2 ? ... ? n = k problem ——求和规律
- 找规律求和:有一分数列:2/1、3/2、5/3、8/5、13/8、21/13......求出这个数列的前20项之和。
- Leetcode - Math -258. Add Digits(数位求和,规律题)
- 【NOIP 模拟题】求和 (打表找规律+递推)
- DataGrid应用技巧两则(downmoon)---列求和与列字段转换d
- ACdream 1115 Salmon And Cat (找规律&&打表)
- P3374 【模板】树状数组 1(单点增减,区间求和)
- 史上最强数字找规律题
- [华为机试练习题]51.数列求和
- 221 - 链表求和 II
- SUM()求和时的精度问题,跟数据表字段定义有关