首页 > 其他分享 >10.10 爆零赛(2023 炼石计划 NOIP 模拟赛 #2)

10.10 爆零赛(2023 炼石计划 NOIP 模拟赛 #2)

时间:2024-10-10 19:44:23浏览次数:10  
标签:10 le 20 炼石 NOIP pmod bmod 爆零赛 equiv

炼石计划 9 月 10 日 NOIP 模拟赛 #2【补题】 - 比赛 - 梦熊联盟 (mna.wang)

模拟赛恒等式:\(0+0+0+0=0\)。

复盘

T1 好像可做。有个显然的 \(n^2\) DP。推式子的时候猜到了 \(\gcd = 1\) 的做法。进一步尝试正解未果。

T2 一眼只会爆搜。想到了 \(b \times b!\) 的做法,应该能过 \(n \le 11\) 的点(实际上这也是出题人的意图)。但是测极限数据 3s,卡常未果。

T3, T4 一分不会。想的时间很少就放弃了。

剩下的时间基本都在 T2 优化(或者说卡常)。

总结

你说呢?

有个好的:T1 做完了正解的第一步。

题解

A. 数位(DP,前缀和,数论)

有 DP:\(f(i, 0/1)\) 表示考虑前 \(i\) 个数,最后一个段是否是倍数串。

转移枚举 \(j \in [0, i)\)。如果 \((j, i]\) 是倍数串那么 \(f(j,0)+f(j,1) \to f(i, 1)\),否则 \(f(j, 1) \to f(i, 0)\)。

可以轻易 \(\mathcal O(n^2)\) 预处理 \(g(j, i) = \operatorname{val}(j, i] \bmod D = (g(j,i-1) \times 10 + a_j) \bmod D\)。转移也是 \(\mathcal O(n^2)\)。考虑优化。

考虑什么时候 \(\operatorname{val}(j, i] \bmod d = 0\),即 \((j, i]\) 是一个倍数串。

类似字符串 Hash。令 \(p(i) = \operatorname{val}[i,n]\)。

首先考虑 \(\gcd(10, D) =1\) 的情况。不难发现 \((j, i]\) 是倍数串等价于 \(p(j + 1) \equiv p(i+1) \pmod D\)。读者自证不难。

然后怎么做?上面代码可以写成:

for (int i = 1; i <= n; ++ i ) {
	f[i][p[1] == p[i + 1]] = 1;
	for (int j = 1; j < i; ++ j ) {
		if (p[j + 1] == p[i + 1]) f[i][1] = (f[i][1] + f[j][0] + f[j][1]) % P;
		else f[i][0] = (f[i][0] + f[j][1]) % P;
	}
}

前缀和优化即可。

考虑 \(\gcd(10, D) \ne 1\) 的情况。不妨设 \(D = 2^x5^yD'\),其中 \(10 \not \mid D’\)。因为 \(D\) 是百万级别所以 \(x, y \le 20\)。

那么 \(p(j + 1) \equiv p(i+1) \pmod D\) 当且仅当下面的条件都满足:

\[\begin{align} p(j + 1) &\equiv p(i+1) \pmod {2^x}\\ p(j + 1) &\equiv p(i+1) \pmod {5^y}\\ p(j + 1) &\equiv p(i+1) \pmod {D'}\\ \end{align} \]

注意到当一个串的长度超过 \(20\) 后,前两个条件是否满足已经可以通过其低 \(20\) 位确定了。这是因为当 \(x \le 20\) 时 \(a_i \times 10^{21} \bmod 2^x = 0\),\(5\) 也同理。也就是说 \(20\) 位之后是多少,都对整个值模 \(2^x,5^y\) 后的结果没有影响。

所以当长度 \(\le 20\)(即 \(i - j \le 20\))时暴力。当长度 \(> 20\) 时,先判断其第 \(20\) 位是否满足前两个条件。注意到 \(\gcd(D', 10) = 1\)。于是又转化了最开始的问题。分类讨论一下再前缀和即可。

标签:10,le,20,炼石,NOIP,pmod,bmod,爆零赛,equiv
From: https://www.cnblogs.com/2huk/p/18456996

相关文章

  • [赛记] 多校A层冲刺NOIP2024模拟赛04
    这场ACCODERS忘交,结果最后想起来匆匆只交了T1,然后文件名还没改,所以爆零了。。。02表示法100pts高精度,不说了;点击查看代码#include<iostream>#include<cstdio>#include<string>#include<cmath>#include<algorithm>usingnamespacestd;stringp[605];stringan......
  • CSP2024 前集训:多校A层冲刺NOIP2024模拟赛04
    前言T1签了。T2一眼后缀数组板子,但是复杂度是\(O(nq\log(n))\)的,极限数据本地\(4\)秒,但如果您会\(O(n)\)求后缀数组的话就直接过掉了,但赛时数据貌似纯随机,遂可以直接过掉,可以优化成\(O(n^2\log(n)+nq)\)或\(O(n^2\log(n)+q)\)的,赛时想打这个但是怕常熟大和上面区别......
  • 多校A层冲刺NOIP2024模拟赛04
    A.02表示法对要求的数二进制拆分,每一位递归求解,大于2就继续拆,是1返回\(2(0)\),是2返回\(2\),由于外层的数比较大,所以要写一个高精除低精点击查看代码#include<bits/stdc++.h>#defineintlonglongconstintmaxn=1e5+10;usingnamespacestd;intn,ans[maxn],top;str......
  • 多校 A 层冲刺 NOIP2024 模拟赛 04
    多校A层冲刺NOIP2024模拟赛04T02表示法签到题记得有一道普及题是没加高精的原吧...将原数高精除变为二进制,然后记搜就好了。T子串的子串签到题注意到\(n\)很小支持\(O(n^2)\)的操作,可以直接预处理出所有\(l,r\)的个数,预处理方式可参考数颜色一题,对于相同的子串只记......
  • 多校A层冲刺NOIP2024模拟赛03
    T1.colorfu正难则反,直接枚举横行,枚举右边界,如果相同,则会对后面以及它本身统计产生\(1\)的贡献,我们直接开个桶统计一下。点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1000+107;intn,m;inta[N][N],cnt[N*N];intsum;......
  • [NOIP2006 提高组] 作业调度方案 题解
    题目描述我们现在要利用 m 台机器加工 n 个工件,每个工件都有 m 道工序,每道工序都在不同的指定的机器上完成。每个工件的每道工序都有指定的加工时间。每个工件的每个工序称为一个操作,我们用记号 j-k 表示一个操作,其中 j 为 1 到 n 中的某个数字,为工件号;k 为 ......
  • [44] (多校联训) A层冲刺NOIP2024模拟赛04
    A.02表示法这题放在ABCD题我可能不会奇怪,但是它放模拟赛T1了赛时代码#include<bits/stdc++.h>usingnamespacestd;classnum_string{ private: stringx; inlinevoiddevided_2(){ stringans="";intnow=0; for(inti=0;i<=(int)x.length()-1;++i){ ......
  • 多校A层冲刺NOIP2024模拟赛04
    多校A层冲刺NOIP2024模拟赛04学校OJ赛时rank28,T10pts,T2100pts,T320pts,T425ptsaccodersrank15,T1100pts,T2100pts,T320pts,T425pts不是,也没人告诉我两个OJ文件名不一样啊02表示法递归+高精除低精。点此查看代码#include<bits/stdc++.h>#include<bits/extc++.h>//......
  • 『模拟赛』多校A层冲刺NOIP2024模拟赛04
    Rank赤石场。A.02表示法签。若干天前在洛谷随到过,不过当时只看了眼讨论区就走了www还好本来不是很难。发现大体上是一个拆分二的幂的问题,从大到小枚举2的幂,判断有没有这个幂只用比较大小关系,然后再对指数做一个同样的操作,递归至不大于2为止,注意\(2^1\)不用输出(1......
  • 10.9(NOIP 模拟赛 #10)
    2025--炼石计划--10月06日--NOIP模拟赛#10【订正】-比赛-梦熊联盟(mna.wang)复盘T1计数题,感觉不难。用样例模拟了一下,找到一个较优的去重方式。然后过了样例。此时8:10。T2好像又是矩阵加速。想正解。想不出来,只能做到\(\mathcalO(n^6\logk)\)的复杂度。......