Product
30分
直接枚举。。不用多说吧。。
100分
蒟蒻{\rm CYJian}CYJian的辣鸡O(NlogN)O(NlogN)做法:
首先,我们用一个常识公式:i \ast j = gcd(i,j)\ast lcm(i,j)i∗j=gcd(i,j)∗lcm(i,j)
然后原式可化为:
\prod_{i=1}^{N}\prod_{j=1}^{N}\frac{i \ast j}{(gcd(i, j))^2} \ (\bmod\ 104857601)i=1∏Nj=1∏N(gcd(i,j))2i∗j (mod 104857601)
(\prod_{i=1}^{N}\prod_{j=1}^{N}i \ast j)\ast(\prod_{i=1}^{N}\prod_{j=1}^{N}gcd(i, j))^{-2} \ (\bmod\ 104857601)(i=1∏Nj=1∏Ni∗j)∗(i=1∏Nj=1∏Ngcd(i,j))−2 (mod 104857601)
(\prod_{i=1}^{N}i^N \ast N!) \ast (\prod_{d=1}^{N} d^{\sum_{i=1}^{N}\sum_{j=1}^{N} [gcd(i, j)==d])^{-2}} \ (\bmod\ 104857601)(i=1∏NiN∗N!)∗(d=1∏Nd∑i=1N∑j=1N[gcd(i,j)==d])−2 (mod 104857601)
(N!)^{2N} \ast (\prod_{d=1}^{N} d^{\sum_{i=1}^{\lfloor \frac{N}{d} \rfloor}\sum_{j=1}^{\lfloor \frac{N}{d} \rfloor} [gcd(i, j)==1])^{-2}} \ (\bmod\ 104857601)(N!)2N∗(d=1∏Nd∑i=1⌊dN⌋∑j=1⌊dN⌋[gcd(i,j)==1])−2 (mod 104857601)
这样的话就能做了。。
前面的东西搞一个快速幂,后面的枚举dd,然后计算N/dN/d内有多少组数是互质的,可以用欧拉函数算。这样就解决了。
大佬{\rm suwakow}suwakow的强劲O(N)O(N)(近似)做法
对于\frac{lcm(i,j)}{gcd(i,j)}gcd(i,j)lcm(i,j),可以考虑枚举每一个质数pp,这样的话这一坨东西在质数pp的贡献即为p^{|t_i-t_j|}p∣ti−tj∣,其中t_xtx表示xx有多少个为pp的因子。
然后可以考虑筛出所有质数后,对于每一个质数容斥处理出NN以内所有数的当前质因子个数,然后经过处理后就能得到当前这个质因子的答案了。
STO {\rm suwakow}suwakow orz
Game
Upd:之前题目有一点问题,感谢巨佬 @ywwywwyww 指出。题面已经更正,原代码只需改动10字节左右即可AC。
事实上。。出题人也不知道能有什么部分分。。题面上那么多不同的数据范围只是想看看一道网络流能乱搞出什么算法。。
大概50分的朴素建图
可以考虑建一个网格图,对于每一个向上/下的边建一条费用11,流量11的边,每一条向左/右边建一条费用00,流量InfInf的边,然后最左边连源点,右边连汇点,然后跑费用流,最多扩展NN次,然后复杂度上界就是O(N^3M^2)O(N3M2),发现不够优秀。
这里的上下边的费用就限制了一操作的次数,左右边流量限制了两个棋子不能走到一起。
即使这种玄学图能充分发挥SpfaSpfa玄学性质,但是可能不能过M=10^4M=104的数据,一定不能过M=10^6M=106的数据。
70分做法
事实上发现MM非常大的时候中间有很多空行没有什么卵用,这时候可以删去这些行,然后只留下有障碍的行及其前一行,这样的话就可以优化到O(N^3T^2)O(N3T2),但是这个玩意是上界,但是SpfaSpfa在这种边权只有0/1/-10/1/−1的网格图+随机数据下跑得远不到上界,所以是可以过的。
Upd: 时限改成1s辣!!
所以上述方法就只能拿暴力分了。。那么怎么优化呢??
100分做法
实际上我们在0/1/-10/1/−1网格图中跑SpfaSpfa有一个非常简单的优化:用双端队列替换掉原来的队列,然后每一次插入的时候和队头比较,如果更小就插入到队头,否则插入到队尾。这样的话我们跑一次SpfaSpfa的复杂度就变成了O(N^2T)O(N2T)了(-1的边对这种方法有影响,但是最多影响一行内的点)。发现现在的复杂度上界是O(N^3T)O(N3T),10^8108左右,开O2跑得过。。
Function
10分做法
直接拿转移方程搞就好了。。
50分做法
直接拿水の三角的做法,相当于KK次询问(11~KK)加起来。。
另一个50分做法
应该还是挺好想的。。
首先拿出那个转移方程:
f[i][j]=f[i][j - 1] + f[i-1][j-1] + f[i-1][j]f[i][j]=f[i][j−1]+f[i−1][j−1]+f[i−1][j]
如果我们把f[i][j-1]f[i][j−1]拆开:
f[i][j] = f[i][j-2]+f[i-1][j-2]+2f[i-1][j-1] + f[i-1][j]f[i][j]=f[i][j−2]+f[i−1][j−2]+2f[i−1][j−1]+f[i−1][j]
如果把第一维为ii的一直拆下去的话,式子就成了这个样子:
f[i][j] = 2\sum_{k=1}^{j-1} f[i-1][k] + f[i-1][j]f[i][j]=2k=1∑j−1f[i−1][k]+f[i−1][j]
然后就能矩阵快速幂了是吧。。
大概就构造个这样的矩阵就好了。。(太弱了只会用表格)
A=A=
1 | 2 | 2 | \dots… | 2 | 2 | 2 |
---|---|---|---|---|---|---|
0 | 1 | 2 | \dots… | 2 | 2 | 2 |
0 | 0 | 1 | \dots… | 2 | 2 | 2 |
\dots… | \dots… | \dots… | \dots… | \dots… | \dots… | \dots… |
0 | 0 | 0 | \dots… | 1 | 2 | 2 |
0 | 0 | 0 | \dots… | 0 | 1 | 2 |
0 | 0 | 0 | \dots… | 0 | 0 | 1 |
然后拿A^N \ast f_0AN∗f0做答案就行了。。
f_1f1是一个K \ast 1K∗1的矩阵,从上到下分别是f[0][1],f[0][2]\dotsf[0][1],f[0][2]…
70分做法
合并两种50分做法。
100分做法
其实和上面的做法差不多。。
可以考虑构造一个多项式A(x)=1+2x+2x^2+2x^3+2x^4 \dots+2x^kA(x)=1+2x+2x2+2x3+2x4⋯+2xk
然后设f_i(x)=f[i][0]+f[i][1]x+f[i][2]x^2+f[i][3]x^3\dots+f[i][k]x^kfi(x)=f[i][0]+f[i][1]x+f[i][2]x2+f[i][3]x3⋯+f[i][k]xk
易得:f_{i+1}(x) = f_i \ast A(x)\ (\bmod\ x^{k+1})fi+1(x)=fi∗A(x) (mod xk+1)
然后我们就可以得到:f_N=f_k \ast A^{N-k}(x)fN=fk∗AN−k(x)
这样就只需要按照转移方程暴力跑出f_kfk的系数,然后一个多项式快速幂就行了。。
注意:不能用f_i (i < k)fi(i<k)乘。因为涉及取模的x_{i+1}xi+1不同。i<ki<k的时候,取模的xx的幂次为i+1i+1,而i \ge ki≥k的时候,更大的位置的答案是不需要的了。所以我们可以不用x^{i+1}xi+1而是x^{k+1}xk+1。
不信可以自己试试。
100分做法
事实上。。BM套上去也是可以做的。。(看到场上有人这么做了才提了一下。。还以为没有人会拿这个搞的。。)BM的话。。可以在fjzzq2002的博客上找到一篇讲解。
Candies
相信大佬都做过这道题,Candies这道题是我在学长讲完那一道数据比较弱的题目yy出来的优化做法。(如果是任意模数就需要MTT了。。)
15分做法
枚举。。不多BB..
15分做法(看起来强一点的做法)
还是上面那一道题的做法吧。。
我们可以设状态f[i][j]f[i][j]表示从ii箱糖中选择箱数为\% k \equiv j%k≡j的方案数,然后考虑加入一箱会有什么影响:
显然是加入的这一箱可以选,也可以不选。所以我们有转移:
f[i][j] = f[i-1][j] + f[i-1][(j-1+k)\%k]f[i][j]=f[i−1][j]+f[i−1][(j−1+k)%k]
然后就可以拿到1515分的高分。。
40分做法
发现kk还是比较小,考虑矩阵快速幂。
然后就可以构造出一个k \ast kk∗k的矩阵,然后就可以O(k^3logN)O(k3logN)做了。。
60分做法(优化1)
这个时候kk变大了,考虑优化。
发现构造的矩阵是一个循环矩阵(此题中为下一行为上一行向右转1得到)
然后就可以考虑每一次做矩阵乘法只需要用第一行乘就行了。因为其他行的答案都可以用旋转得到。
这样复杂度就是O(k^2 \ast logN)O(k2∗logN)
60分做法(优化2)
考虑合并xx箱的答案f[x]f[x]和yy箱的答案f[y]f[y]
发现可以有一个暴力转移:
f[x+y][(i + j) \% k] = \sum f[x][i] \ast f[y][j]f[x+y][(i+j)%k]=∑f[x][i]∗f[y][j]
简单的乘法原理应该没有问题吧。。
然后就发现可以倍增,这样就预处理出每一个二进制位的f[x]f[x],然后根据NN的二进制位合并答案就好了。
复杂度O(k^2 \ast logN)O(k2∗logN)
100分做法
发现上面的优化2是一个卷积的形式,所以可以NTTNTT优化。只不过卷积乘出来超出k的部分需要把多的部分弄进kk的范围内。简单来说,就是f[i](i>k)f[i](i>k)就要加到f[i\%k]f[i%k]里面。
发现题目非常友好没有要写MTT,给出的模数的原根就是33.
复杂度O(k \ast logk \ast logN)O(k∗logk∗logN)