Add One(数位dp+预处理)

题目:You are given an integer n. You have to apply mm operations to it.

In a single operation, you must replace every digit dd of the number with the decimal representation of integer d+1. For example, 1912 becomes 21023 after applying the operation once.

You have to find the length of n after applying mm operations. Since the answer can be very large, print it modulo 10^9+7.

大意:给定一个数n,每进行一次操作,这个数每一位都会+1并以十进制的形式表示,即1912进行一次操作后1->2,9->10,1->2,2->3,就变成21023,求进行m次这种操作后,n这个数的长度。

思路:对于每个位置上的数d,它对它后一位d+1贡献为1(特殊情况9分别对1、0的贡献为1)。那么,我们设dp[i][j]为进行i次操作,数字j的个数。显然,可以推出状态转移方程

当j=0时,dp[i][0]=dp[i-1][9];

当j=1时,dp[i][1]=dp[i-1][0]+dp[i-1][9];

当j!=1&&j!=0,dp[i][j]=dp[i-1][j-1];

我们注意到,如果每次都要dp递推,显然会超时(4e11)。所以我们要预处理一下,把n设为10,m=2e5,这样问题就转化为,这个数到10需要k次。最后可得出答案。

代码:

#include<bits/stdc++.h>
using namespace std;
long long mod=1e9+7;
long long dp[200005][15],a[15],sum[200005];
int main()
{
	int t;
	scanf("%d",&t);
	dp[0][0]=dp[0][1]=1;
	sum[0]=2;
	for(int i=1;i<=200000;i++)
	{
		for(int j=0;j<=9;j++)
		{
			if(j==0) dp[i][j]=(dp[i-1][9])%mod;
			else if(j==1) dp[i][j]=(dp[i-1][0]+dp[i-1][9])%mod;
			else dp[i][j]=(dp[i-1][j-1])%mod;
			sum[i]=(sum[i]+dp[i][j])%mod;
		}
	}
	while(t--)
	{
		long long n;
		int m;
		memset(a,0,sizeof(a));
		scanf("%lld %d",&n,&m);
		while(n){
			a[n%10]++;
			n/=10;
		}
		long long ans=0;
		for(int i=0;i<=9;i++)
		{
			if(a[i]){
			if(m-(10-i)>=0) ans=(ans+a[i]*sum[m-(10-i)])%mod;
			else ans=(ans+a[i])%mod;
			}
		}
		printf("%lld\n",ans);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
贝叶斯分类是一种基于贝叶斯定理的机器学习算法,用于进行分类任务。它假设特征之间是相互独立的,并根据输入样本的特征概率来计算后验概率,从而确定样本属于各个类别的可能性,并选择后验概率最大的类别作为分类结果。 贝叶斯分类的计算过程可以简单描述为以下几个步骤: 1. 收集训练集:收集包含已知类别标签的训练样本,以及样本的特征。 2. 计算先验概率:计算各个类别的先验概率,即每个类别的样本占总样本的比例。 3. 计算条件概率:根据训练样本,计算每个特征在每个类别下的条件概率。 4. 计算后验概率:使用贝叶斯定理,结合先验概率和条件概率,计算每个类别在给定特征下的后验概率。 5. 预测分类结果:选择后验概率最大的类别作为样本的分类结果。 而"add one"计算题是指在统计学中常用的平滑算法之一。在计算频率时,如果某个事件在样本中没有出现过,根据统计学的原则,其频率应该为0。但是在实际应用中,为了避免概率为0导致后续计算出错的情况,可以使用"add one"平滑算法。 "add one"平滑算法的计算方式是:在每个事件的频率上加上一个常数α,即将每个事件的频数加1,然后再进行频率的计算。这样做可以有效地解决概率为0的问题,并且避免出现负数的情况。 例如,有一个样本集合包含三个类别的数据,每个类别的频数分别为0、2和3。使用"add one"平滑算法后,每个类别的频数分别为1、3和4,这样就可以计算每个类别的概率。 总结来说,贝叶斯分类是一种基于贝叶斯定理的分类算法,通过计算特征和类别之间的概率关系来进行分类。而"add one"计算则是一种在统计学中常用的平滑算法,用于解决频率为0的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值