【JZOJ4819】【NOIP2016提高A组模拟10.15】算循环
生活随笔
收集整理的這篇文章主要介紹了
【JZOJ4819】【NOIP2016提高A组模拟10.15】算循环
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
輸入
輸出
樣例輸入
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)
再得
其中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(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]
綜上得證。
轉載于:https://www.cnblogs.com/hiweibolu/p/6714869.html
總結
以上是生活随笔為你收集整理的【JZOJ4819】【NOIP2016提高A组模拟10.15】算循环的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android app反解工具,安卓反编
- 下一篇: -9 逆序输出一个整数的各位数字_【每日