zsy姐姐的NH-02

为了给平时C语言作业AK加上亿点点难度,zsy决定给我们一点不是那么水的题~

https://lexue.bit.edu.cn/mod/programming/view.php?id=328959

(BIT校园网似乎不能靠链接进乐学捏~~)

吃吃吃你就知道吃(
一开始看到10e18的数据和离谱的复杂度我是拒绝的,但是发现有不止一个人ac,那就说明存在一些奇技淫巧!
观察了一下测试用例:
ans[4]=34
ans[5]=52
ans[6]=74
ans[7]=100
发现ans是一个二级等差数列(18,22,26)->(4,4);
累加法可以算出其通项公式:ans[n]=ans[n-1]+4*n-2;
ans[n]=\(2*n^2\)+2

#include<stdio.h>
#include<math.h>
int main(){ 
long long n1,n2;
scanf("%lld%lld",&n1,&n2);
long long ans1=2*n1*n1+2,ans2=2*n2*n2+2;
printf("%lld %lld\n",ans1,ans2);
return 0;
}

直觉告诉我,正解应该是证明这个通项公式
(明天再写)
—————————————————————————————————(我是一个分界线)
但是我一开始以为这玩意类似dp,需要我证明状态转移方程来找递归,结果当然是不行了
随后在大佬指点下,发现需要用生成函数解决(在这里花30min浅学一下latex)

\[f(x)=\sum_{n}a_n*x_n \]

普通生成函数
f(x)中\(x^n\)的系数表示总共状态数达到n个时的总方案数
eg.第三种巧克力有三个:<0,1,2,3> f(x)=\(1+x+x^2+x^3\)表示可以选0,1,2,3个第三种巧克力,各有一种方案(这里也要用等比数列简化一下 \(\frac{1-x^4}{1-x}\))
eg.第五个巧克力选2的倍数:<0,2,4,6...2*n> f(x)=\(1+x^2+x^4+x^6+...+x^{2n}\)这个时候这样写就不太方便,考虑用麦克劳林展开式来改成封闭形式:
f(x)=\(\frac{1}{1-x^2}\)

(像我一样工数上没学好的xdm也可以这样推:f(x)*\(x^2\)=f(x)-1)


有了这些知识我们就可以先解决这个题:


f(x)=\(\frac{(1+x)(1+x+x^2)(1+x+x^2+x^3)}{(1-x)(1-x^2)(1-x^3)}\)=\(\frac{1+x+x^2+x^3}{(1-x)^3}\)=\((1+x+x^2+x^3)*(\sum_{i=0}^{INF}x^i)^3\)


然后$(\sum_{i=0}^{INF}x^i)^3$可以用**牛顿二项式**展开为$\sum_{i=0}^{inf}\frac{(1+i)(2+i)}{2}*x^i$


再来介绍一下牛顿广义二项式展开( $(1-p)^{-r}=\sum_{k=0}^{inf}\binom{-r}{k}(-p)^k=\sum_{k=0}^{inf}\binom{k+r-1}{k}p^k$ )

然后就可以得到结果啦~

\((1-x)^{-3}=\sum_{0}^{inf}\binom{k+2}{k}x^k=\sum_{0}^{inf}\binom{k+2}{2}x^k\)


所以\((\sum_{i=0}^{INF}x^i)^3\)的k次项系数为\(\frac{(k+1)(k+2)}{2}\)


那么乘上左边的式子就变成了ans=\(\frac{(n+1)(n+2)}{2}+\frac{n(n+1)}{2}+\frac{(n-1)n}{2}+\frac{(n-2)(n-1)}{2}=2(n^2+1)\)

花了很长时间写这玩意,得出几个结论:
1.数论知识和数学功底对于acmer是很重要的啊~要补一补数学
2.latex好麻烦,以后少写点用latex的blog
然鹅我们不会满足于只解决这个问题,生成函数还有一些更复杂的东西,等我去oiwiki上看一看再续写叭~~

posted @ 2022-03-10 00:03  misasteria  阅读(49)  评论(0编辑  收藏  举报