今天好像是NESCAFE系列
T1 异化多肽
这个应该还是比较简单的,就是先弄出DP的转移方程,然后弄成多项式的形式: F[i] 表示进行第 i 次加入氨基酸的生成函数,那么久很容易得到F[i]=F[i]*H+1, H就是根据初始的氨基酸的质量来统计出来的数组,虽然 F[i] 的每一项不是仅仅从前一项转移过来,但是当 i 趋于正无穷的时候,那么 F 这个多项式在 mod x^n 的意义下是稳定不变的,然后就多项式求逆就行了
T2 编码病毒
这个题就是看起来比较的吓人,弄了一个看起来很麻烦的校验公式,但是手动模拟一下就可以得到,其实 X1, C 就是把data平移了几位,然后 X2 支持将data串取反,考虑暴力的话就是暴力O(n)的枚举每一种平移的状态,然后通过已有的对应位数量来判断将这个状态的两个串变成一样所需要的变化步数,然后在计算出平移到这个位置需要的最小步数,将两者相加,然后对所有的和取 min 就好了。
然后正解的话就是把暴力算两个串的匹配数量变成用 NTT 优化就好了
有一个值得注意的地方就是,同一方向上,平移(i+n)步可能会比平移 i 步更优,因为 (i+n)的二进制数中1的个数可能会更少。。。。
还有两个值得注意的地方就是,虽然公式里给的是 Test=Data... 但是输入里是先给的Data,再给的Test,然后不按套路的,先给的m后给的n,然后我就弄反了
T3 数论函数簇
这个题的话,首先把柿子展开: a*(a*x+b)+b=a*x+b (mod n)
然后就可以发现移项可以发现两个条件 1、a*(a-1)=0 (mod n) 2、a*b=0(mod n)
假设现在a确定,那么设d=gcd(a,b),则b=k*n/gcd --> k=n/(n/gcd)=gcd
然后就可以O(n^2)枚举得到20分。
50分的话就是因为n|a*(a-1),设p*q==n && gcd(p,q)==1,a=k1*p,b=k2*q --> k1*p-1=k2*q
然后加强一下条件就是k1*q=1(mod q)
然后因为k1*p<n --> k1<n/p --> K1<q
然后根据什么欧几里德定理就可以知道这玩意只有唯一解
那么就是对于每一个合法的P && P<n 都会有gcd(p,n)=p的贡献
然后类似于二项式定理的办法,答案就是 ∏(Pi^ai+1)其中p是n的因子,因为p==n时是不合法的,所以要在-n
设R(i)=∏(Pi^ai+1)-n,那么R(i)+n是积性函数,可以先筛。
满分的话就是先把n瞥到一边,然后Σ(i<=n)Σ(d|i)Σ(k|d,k|i/d)μ(k)*d 反演一下
最后的到这个柿子Σμ(k)*i*k*[n/i(k^2*i)],然后前面有贡献的范围是到sqrt(n),后面是个log,就可以拿到100分啦