首页 > 其他分享 >20241024比赛总结

20241024比赛总结

时间:2024-10-24 17:10:52浏览次数:8  
标签:总结 pre 20 比赛 sum3 100005 20241024 dp mod

T1 数位

设\(dp_{i,0/1}\)表示前i位,最后一段是/不是d倍数的方案数

令\(d=2^x 5^y m\)

可以将模d同余转化为模\(2^x\),\(5^y\),\(m\)分别同余

因为\(2^{20}=1048576>10^6\) 所以,当\(j<=i-20\)时,前两项的结果均为0

所以首先可以开两个前缀和,求sum[i-1]*10+s[i]-'0'对前两项的取模结果,不为0则直接跳过

接下来考虑m,记\(pre_i=pre_{i-1}+s_i*10^{n-i}\),则合法必然满足\((pre_i-pre_j)/10^{i-j}\equiv 0(\bmod m)\)

因为\(m\)和10互质,所以\(pre_i-pre_j=0\),可以按照\(pre_i\)的值开桶,记录每个值的\(dp_{i,0}\)之和

\(j>i-20\)部分按第一档部分分的方法解决即可

代码:

#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
const int mod=1e9+7;
int T,d,p[100005],sum[100005],dp[100005][2],p1[100005];
int sum1[100005],sum2[100005],sum3[100005],n;
int pre[1000005][2],cnt;
string s;
int main()
{
	freopen("digit.in","r",stdin);
	freopen("digit.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>T;
	while(T--)
	{
		cin>>s>>d;
		n=s.size();
		s=" "+s;
		p[0]=p1[0]=1;
		for(int i=1;i<=n;i++)
		{
			p[i]=p[i-1]*10%d;
		}
		int cnt2=1,cnt5=1,x=d;
		while(x%2==0) x/=2,cnt2*=2;
		while(x%5==0) x/=5,cnt5*=5;
		for(int i=1;i<=n;i++)
		{
			p1[i]=p1[i-1]*10%x;
		}
		for(int i=1;i<=n;i++)
		{
			sum[i]=(sum[i-1]*10+s[i]-'0')%d;
			sum3[i]=(sum3[i-1]+(s[i]-'0')*p1[n-i])%x;
			sum1[i]=(sum1[i-1]*10+(s[i]-'0'))%cnt2;
			sum2[i]=(sum2[i-1]*10+(s[i]-'0'))%cnt5;
		//	printf("%d %d %d %d\n",sum[i],sum1[i],sum2[i],sum3[i]);
		}
		dp[0][0]=1,cnt=0;
		for(int i=1;i<=n;i++)
		{
			if(i>=20)
			{
				pre[sum3[i-20]][0]=(pre[sum3[i-20]][0]+dp[i-20][0])%mod;
				pre[sum3[i-20]][1]=(pre[sum3[i-20]][1]+dp[i-20][1])%mod;
				cnt=(cnt+dp[i-20][0])%mod;
			}
			if(sum1[i]!=0||sum2[i]!=0)
			{
				dp[i][1]=cnt,dp[i][0]=0;
			}
			else
			{
				dp[i][1]=(cnt-pre[sum3[i]][0]+mod)%mod;
				dp[i][0]=(pre[sum3[i]][0]+pre[sum3[i]][1])%mod;
			//	printf("%d %d %d\n",cnt,pre[sum3[i]][0],pre[sum3[i]][1]);
			}
			for(int j=max(0,i-19);j<i;j++)
			{
				int x=sum[i]-1ll*sum[j]*p[i-j]%d;
				if(x==0) dp[i][0]=(1ll*dp[i][0]+dp[j][0]+dp[j][1])%mod;
				else dp[i][1]=(1ll*dp[i][1]+dp[j][0])%mod;
			}
		//	printf("%d %d\n",dp[i][0],dp[i][1]);
		}
		for(int i=0;i<=n;i++) pre[sum3[i]][1]=pre[sum3[i]][0]=0;
		cout<<(dp[n][1]+dp[n][0])%mod<<"\n";
	}
	return 0;
}

标签:总结,pre,20,比赛,sum3,100005,20241024,dp,mod
From: https://www.cnblogs.com/wangsiqi2010916/p/18499979

相关文章

  • 最强总结!十大回归类算法模型 !!!
    1.线性回归线性回归是一种用于描述两个或多个变量之间线性关系的统计模型。假设  是响应变量(目标变量), 是解释变量(特征),线性回归模型通过拟合一条直线来预测目标变量。原理线性回归的基本假设是:其中, 是截距, 是回归系数, 是误差项(即残差),假设其服从正态分布。核心公式......
  • 2024/10/24 模拟赛总结
    \(100+60+60+40=260\),这种信心赛没AK我真的要退役了#A.长方体喜欢写线段树和ST表的小朋友们你们好呀,我是前后缀\(\min/\max\)奥特曼对于\(n\)个长方体的交,显然就是最靠右的左面、最靠左的右面、最靠上的下面……组成的长方体枚举一个不存在的长方体接下来考虑容斥,对......
  • 刷题总结——树
    总结刷题中遇到的与树有关问题遍历问题前中后序遍历有递归与送代两种写法迭代时需要栈模拟,中序遍历单独注意写法(类似于模拟调用栈),后序遍历可以通过前序遍历+反转的方式实现题目LC编号注意事项前序递归144正常递归前序非递归144插入单个root后进行Stack......
  • 大二上 数据结构与算法笔记 20241024
    一.inline在C和C++编程语言中,inline关键字是一种函数修饰符,用于建议编译器在编译时将函数的代码直接插入到每个函数调用的地方,而不是进行常规的函数调用。这样做的目的是减少函数调用的开销,尤其是在函数体较小且调用频繁的情况下。作用和优点:减少函数调用开销:通过将函数......
  • nginx总结
    使用auth_basic控制访问nginx代理的网站,直接访问如果需要添加安全性,如需要输入用户名+密码才能访问页面,可以通过nginx的auth_baisc配置来实现检查htpasswd一般nginx的安装之后会自带或者nginx容器镜像自带root@ea6255db9f51:/config/nginx/site-confs#htpasswdUsage:......
  • 2024-2025-1 20241401 《计算机基础与程序设计》 第五周学习总结
    班级链接2024计算机基础与程序设计作业要求第五周作业作业目标①Pep/9虚拟机②机器语言与汇编语言③算法与伪代码④测试:黑盒,白盒教材学习内容总结《计算机科学概论》第六章计算机操作:介绍了计算机的基本操作,包括机器语言的基本概念。机器语言是由一系......
  • Leetcode每日一题:3175. 找到连续赢 K 场比赛的第一位玩家
    题意为给定一个数组,数组头两数比大小,大的放队首,小的放队尾,找到能够连续赢K次的数的编号。思路:如果一轮比较完了,没有赢K次的,那答案就是数组最大值。利用双指针,模拟一轮比较,计算每个数的胜利次数,注意,若起点不是0的话,意味着他和之前的数比较是胜出的,所以初始为1,否则初始为0;1clas......
  • 华为OD机试真题-比赛-2024年OD统一考试(E卷)
    最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客     每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。题目描述一个有N个选手参加比......
  • 考前总结与策略提示
    考前总结与策略提示策略提示放轻松,据以往数据考虑,太紧张会大大降低思考效率不要考虑他人的分数或XXX能不能做出来或没做处理会怎样,考场不是拿来写回忆录的,请珍惜你通过训练换来的考试机会。抄dx的当一个思路的混沌程度/实现难度太高的时候,回溯并重新来如果花费时......
  • 3175. 找到连续赢 K 场比赛的第一位玩家
    有n位玩家在进行比赛,玩家编号依次为0到n-1。给你一个长度为n的整数数组skills和一个正整数k,其中skills[i]是第i位玩家的技能等级。skills中所有整数互不相同。所有玩家从编号0到n-1排成一列。比赛进行方式如下:队列中最前面两名玩家进行一场比赛,......