solution-code4763

每种食物的生成函数

汉堡: 1+x2+x4+=11x2
可乐: 1+x=1x21x
鸡腿: 1+x+x2=1x31x
蜜桃多: x+x3+x5+=x1x2
鸡块: 1+x4+x8+=11x4
包子: 1+x+x2+x3=1x41x
土豆片炒肉: 1+x=1x21x
面包: 1+x3+x6+=11x3

乘在一起得到: f(x)=x(1x)4=x(1x)4
带入广义二项式定理得 f(x)=xi=0Ci+3ixi
i=n1时第n1项为 xCn+2nxn=Cn+23xn
所以答案就为ans=n(n+1)(n+2)6

阅读更多

[luogu4834]萨塔尼亚的期末考试

这里有oeis的解释,但是我看不懂
题目大意:快速地求 ans=i=1n(ifib(i))n(n+1)2 i=1nfib(i)=1+fib(1)+fib(2)++fib(n)1[1+(1)==0]=(fib(2)+fib(1))+fib(3)++fib(n)1[fib(1)==fib(2)]=(fib(3)+fib(2))+fib(4)++fib(n)1[fib(1)+fib(2)==fib(3)]==fib(n+2)1 i=1nifib(i)=ni=1nfib(i)i=1n1j=1ifib(j)=n(fib(n+2)1)i=1n1(fib(i+2)1)=nfib(n+2)n(i=1n1fib(i+2))+(n1)=nfib(n+2)(i=1n+1fib(i)2)1=nfib(n+2)(fib(n+3)12)1=nfib(n+2)fib(n+3)+2
写一个矩阵快速幂就可以解决问题,时间复杂度O(Tlog2(n)),但是不出意料的T掉了
观察一下结果,可以发现我们分别对ans中两个相邻的fib值进行计算,这并没有利用好矩阵乘法的性质
回想一下最初学习矩阵快速幂的时候,老师演算fib的时候是一个1×2的矩阵乘上2×2的矩阵,像这样: [fib(n)fib(n1)][1110]=[fib(n1)fib(n2)]
我们用老师最初讲的方法来计算fib的值,可以节省一半的时间,在加上2×2的矩阵乘法不用for循环,就可以轻松切过这道题了~

UPD: 老师最后写的方法并不是错的,在只求一次或者不相邻的项中会显得更快一些,但这并不代表我们可以忘掉原来讲的那种方法(这真的是一道好题)
最终的矩阵为: [10][1110]n+3

阅读更多

NTT用到的各种素数

转载自 miskcoo
是这样的,这几天在写NTT,由于是在模意义下的,需要各种素数……
然后就打了个表方便以后查了
如果r(2k+1)是个素数,那么在modr(2k+1)意义下,可以处理2k以内规模的数据,
2281701377=17×227+1是一个挺好的数,平方刚好不会爆 long long
1004535809=479×221+1加起来刚好不会爆 int 也不错
还有就是UOJ常用的998244353=119×223+1
打表方法:对于每个k,找到最小r满足r(2k+1)是素数(g是modr(2k+1)的原根)

阅读更多