题目描述

输入

输出

样例输入

167 198

样例输出

906462341

数据范围

解法

令f(n)=∑ni=1i,g(n)=∑ni=1i2

易得ans=∑ni=1∑mj=1f(n−i+1)∗f(m−j+1)

等价于ans=∑ni=1∑mj=1f(i)∗f(j)

显然f(n)=n∗(n−1)/2;

拆开得ans=14∑ni=1∑mj=1i∗(i+1)∗j∗(j+1)

再得

ans=14∑i=1ni∗(i+1)∗∑j=1mj∗(j+1)=14∑i=1n∗(f(i)+g(i))∗∑j=1m∗(f(j)+g(j))

其中g(n)=16n(n+1)(2n+1)


时间复杂度为O(log),逆元有复杂度。

代码

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#define ll long long
#define ln(x,y) ll(log(x)/log(y))
#define sqr(x) ((x)*(x))
using namespace std;
const char* fin="loop.in";
const char* fout="loop.out";
const ll inf=0x7fffffff;
const ll mo=1000000007;
ll n,m,i,j,k,l,tmp,tmd,num,ans;
ll qpower(ll a,ll b){
ll c=1;
while (b){
if (b&1) c=a*c%mo;
a=a*a%mo;
b>>=1;
}
return c;
}
ll N(int a){
return qpower(a,mo-2);
}
ll sum(ll st,ll num){
st%=mo;
num%=mo;
ll en=(st+num-1)%mo;
return (st+en)%mo*num%mo*N(2)%mo;
}
ll xsum(ll n){
n%=mo;
return n*(n+1)%mo*(2*n+1)%mo*N(6)%mo;
}
ll count(ll v){
return (sum(1,v)+xsum(v))%mo;
}
int main(){
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
scanf("%lld%lld",&n,&m);
ans=count(n)*count(m)%mo*N(4)%mo;
printf("%lld",ans);
return 0;
}

启发

∑的运算性质

1.∑(a+b)=∑a+∑b

2.∑a∑ba∗b=∑aa∗∑bb

3.∑ik∗f(i)=k∗∑f(i)

∑ni=1i2公式

∑ni=1i2=16n(n+1)(2n+1)

证明:

利用数学归纳法检验。

设g(n)=∑ni=1i2;

先有

g(1)=16∗1∗2∗3=1=∑i=1ni2

如果g(x)满足g(x)=16x(x+1)(2x+1);

g(x+1)=16x(x+1)(2x+1)+(x+1)2=16(x+1)(6x+6+x(2x+1))=16(x+1)(2x2+7x+6)=16(x+1)(x+2)(2x+3)=16(x+1)[(x+1)+1][2(x+1)+1]

综上得证。

【JZOJ4819】【NOIP2016提高A组模拟10.15】算循环的更多相关文章

  1. 【NOIP2016提高A组模拟10.15】最大化

    题目 分析 枚举两个纵坐标i.j,接着表示枚举区域的上下边界, 设对于每个横坐标区域的前缀和和为\(s_l\),枚举k, 显然当\(s_k>s_l\)时,以(i,k)为左上角,(j,k)为右下角 ...

  2. 【JZOJ4820】【NOIP2016提高A组模拟10.15】最大化

    题目描述 输入 输出 样例输入 3 2 4 0 -10 8 -2 -2 样例输出 4 数据范围 解法 枚举两条扫描线,在这两条扫描线之间的矩阵,可以将之转化为一个序列b[i]=a[i][1..m]. ...

  3. NOIP2016提高A组模拟10.15总结

    第一题,就是将原有的式子一步步简化,不过有点麻烦,搞了很久. 第二题,枚举上下边界,维护一个单调队列,二分. 比赛上没有想到,只打了个暴力,坑了80分. 第三题,贪心,最后的十多分钟才想到,没有打出来 ...

  4. 【NOIP2016提高A组模拟10.15】打膈膜

    题目 分析 贪心, 先将怪物按生命值从小到大排序(显然按这个顺序打是最优的) 枚举可以发对少次群体攻击, 首先将所有的群体攻击发出去, 然后一个一个怪物打,当当前怪物生命值大于2,如果还有魔法值就放重 ...

  5. 【NOIP2016提高A组模拟10.15】算循环

    题目 分析 一步步删掉循环, 首先,原式是\[\sum_{i=1}^n\sum_{j=1}^m\sum_{k=i}^n\sum_{l=j}^m\sum_{p=i}^k\sum_{q=j}^l1\] 删 ...

  6. 【NOIP2016提高A组模拟9.15】Osu

    题目 分析 考虑二分答案, 二分小数显然是不可取的,那么我们将所有可能的答案求出来,记录在一个数组上,排个序(C++调用函数很容易超时,手打快排,时间复杂度约为\(O(>8*10^7)\),但相 ...

  7. 【NOIP2016提高A组模拟8.15】Garden

    题目 分析 其实原题就是[cqoi2012][bzoj2669]局部极小值. 有一个n行m列的整数矩阵,其中1到nm之间的每个整数恰好出现一次.如果一个格子比所有相邻格子(相邻是指有公共边或公共顶点) ...

  8. 【JZOJ4784】【NOIP2016提高A组模拟9.15】Map

    题目描述 输入 输出 样例输入 4 4 2 1 2 2 3 3 2 3 4 1 2 1 4 样例输出 14 数据范围 样例解释 upd:保证原图连通. "不相交路径"的定义为不存在 ...

  9. 【NOIP2016提高A组模拟9.15】Map

    题目 分析 发现,当原图是一棵树的时候,那么新建一条边后,就会变成环套树, 而环内的所有点对都是安全点对,如果环中有k个点,答案就是\(k(k-1)\) 联想到,当把原图做一遍tarjan缩点,每个环 ...

随机推荐

  1. matlab保存数据

    一:存txt文件,用dlmwrite()dlmwrite 将一个矩阵写到由分隔符分割的文件中. 在保存整数到文件时使用save存为ascii文件时,常常是文件里都是实型格式的数据(有小数点,和后面很多 ...

  2. Java常用的数据结构

    collection : List:arrayList,linkedList,vector set:treeSet ,hashSet; map: hashMap treeMap linkedHashM ...

  3. Win3.2有人用过么

    老牌子的操作系统. 了,有人用过么,我还在用,感觉挺不错的,哈哈哈哈哈.   1.0那一代,画面粗糙,几乎不能算GUI操作系统.   2.0,画面较1.0一代明显改善,可惜的是,手头没货.   3.0 ...

  4. TZ_10_常用的2中加密算法MD5,spring-sucrity

    1.MD5 在注册时需要进行加密,在登陆时也需要加密进行配对 public class MD5util { public static String stringToMD5(String psd) { ...

  5. JS 生成二维码和加上logo图片

    参考链接:https://www.cnblogs.com/chiyi/p/5710324.html,http://www.jq22.com/jquery-info294 demo链接:demo查看 d ...

  6. CodeChef--EQUAKE

    题目链接 Earthquake in Bytetown! Situation is getting out of control! All buildings in Bytetown stand on ...

  7. 【python自动化学习笔记】

    [python自动化第一篇:python介绍与入门] [python自动化第二篇:python入门] [python自动化第三篇:python入门进阶]      [Python自动化第三篇(2):文 ...

  8. dedecms list标签调用附加表字段--绝对成功

    使用list标签调用附加表字段的时候会忽略一个地方,明明附加字段名已经添加进去了就是调用不出来 经过在网上查询了资料,说的天花乱坠,也都实践过一些,但是就是不成功鞋面介绍一下犯的低级错误在哪里 {de ...

  9. oracle习题-简单查询

    题一 1 实现将已知表中的数据插入到另一个表中 学生表:stu1 向表中插入两条数据   学生信息表2:stuinfo 将stu1表中的两条数据导入到stuinfo表中,执行下列语句 此时查看一下st ...

  10. Axure之母版窗口