fxtoi Hanriver
我们尝试着对题目进行转化
原式:\(m!+30(\sum\limits_{i=1}^{n-1}{(i^4+4i^3+6^2+4i+1)+1})\)
拆成两部分:\(m!\)与\(30(\sum\limits_{i=1}^{n-1}{(i^4+4i^3+6^2+4i+1)+1})\)
先看\(m!\)。不要以为\(3000000039\)这个数只能拿来\(\%\),它还有其他用处。
其实稍微思索一下就会发现,当\(m\geq3000000039\)时,\(m!\%3000000039=0\)
但这肯定还不够啊\(qwq\),\(3000000039\)大概也只有用银河才能一秒跑完。
我们尝试把\(3000000039\)分解质因数,得到\(3\times7699\times129887\)。那么只要\(m\geq129887\)时,\(m!\%3000000039=0\)
再看\(30(\sum\limits_{i=1}^{n-1}{(i^4+4i^3+6^2+4i+1)+1})\)
稍微观察一下就得到了一个很简单的式子:\(30(\sum\limits_{i=1}^{n-1}{(i+1)^4}+1)\)
再转一下就得到\(30(\sum\limits_{i=1}^{n}{i^4})\)这么一个东西,就可以推公式了。
公式推导过程如下:
\(\sum\limits_{i=1}^{n+1}{i^5}=\sum\limits_{i=1}^{n}{i^5}+(n+1)^5\)
\(\sum\limits_{i=0}^{n}{(i+1)^5}=\sum\limits_{i=1}^{n}{i^5}+(n+1)^5\)
\(\sum\limits_{i=0}^{n}{(i^5+5i^4+10i^3+10i^2+5i+1)}=\sum\limits_{i=1}^{n}{i^5}+(n+1)^5\)
\(\sum\limits_{i=0}^{n}{5i^4}=i^5+5i^4+10i^3+10i^2+4i-\sum\limits_{i=1}^{n}{10i^3}-\sum\limits_{i=1}^{n}{10i^2}-\sum\limits_{i=1}^{n}{5i}\)
现在我们面对的问题就是\(\sum\limits_{i=1}^{n}{i^3}\)和\(\sum\limits_{i=1}^{n}{i^2}\)了,自己慢慢推吧。直接放公式了
\(\sum\limits_{i=1}^{n}{i^4}=\frac{n(n+1)(2n+1)(3n^2+3n-1)}{30}\)
然后再乘上我们落下的\(30\),得到
\(\sum\limits_{i=1}^{n}{i^4}=n(n+1)(2n+1)(3n^2+3n-1)\)
于是我们就得到很好写的代码了:
#include<cstdio>
using namespace std;
unsigned long long n,m,ans,tot,pus,now;
int main(){
register unsigned long long i;
scanf("%llu%llu",&n,&m);
if(m<129887){
ans=1;
for(i=1;i<=m;i++) ans=ans*i%3000000039;
}
tot=n%3000000039;
now=tot*tot%3000000039;
now=(3*tot+3*now)%3000000039;
if(!now) now=3000000038;
else now--;
now=now*tot%3000000039;
now=now*(tot+1)%3000000039;
now=now*((2*tot+1)%3000000039)%3000000039;
printf("%llu\n",(now+ans)%3000000039);
}