把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

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);
}
posted @ 2020-03-14 10:32  275307894a  阅读(48)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end