uva 11361 Investigating Div-Sum Property 数位dp

14 篇文章 0 订阅
1 篇文章 0 订阅
//		uva 11361 Investigating Div-Sum Property 数位dp
//
//	题目大意:
//		
//		给你一个整数a和一个整数b,问在[a,b]范围内,有多少个自身被k整除并且
//		各位数之和也能被k整除.比如k = 7 ,322满足条件,因为332能被整除7,并
//		3 + 2 + 2 = 7 也能被7整除
//
//	解题思路:
//
//		求一个区间的题目,这类题目,往往可以转化为不超过x的f(x).则最后要求
//		的就是f(b) - f(a-1).如何确定这个f(x).设d(i,m1,m2)为不确定的数字有
//		i个,已经确定的位的数子之和对k的余数对于k来说还需要m1才能凑成0,已经
//		确定的位的数值大小对于k的余数对k来说还需要m2才能凑成0的满足要求的个数
//		则d(i,m1,m2) = sigma(d(i-1,((m1-x)%k+k)%k,((m2 - x * 10^(i-1))%k+k))
//		{0<=k<=9},逐位求解.最后求和.采用记忆话搜索的方式.非常经典并且状态十分
//		完美的题目.
//
//	感悟:
//
//		这是在训练指南上看到的题目,开始看的时候,被k<=10000给吓到了.搞不了啊.这里
//		就要批评一下自己啦,要认真分析题目,不要被题目给的数据吓到了.认真分析啊!!!
//		看书上的分段求解还是云里雾里的.与传说中的数位dp有点类似.没想到还真是0.0
//		顺着书往下看,发现书上定义的状态十分的让人赞不绝口.不是我这等菜鸟所能想到的
//		状态.状态有了,dp的转移倒不是很难理解,实现起来对于我来说还是有点困难,因为
//		比较难掌控一些细节.整体的格局也不是很清楚.看了看大神们的优美代码,发现
//		记忆化搜索还是更好理解一些.虽然可能会慢一点,但重在好理解不是嘛.
//
//		初步接触数位dp,虽然知道是逐位进行,但是状态不是很好想.
//		不说什么啦,继续加油~~~FIGHTING

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>

using namespace std;

typedef long long ll;

int x,y,k;
int a[15];
int vis[15][105][105];
ll d[15][105][105];
ll pow[15] = {1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};

ll dp(int cnt,int m1,int m2){
	if (cnt==0)
		return (m1==0 && m2==0)?1:0;
	if (vis[cnt][m1][m2])
		return d[cnt][m1][m2];
	vis[cnt][m1][m2] = 1;
	ll& ans = d[cnt][m1][m2];
	for (int j=0;j<10;j++){
		ans += dp(cnt-1,((m1-j)%k+k)%k,((m2 - j * pow[cnt-1])%k+k)%k);
	}
	return ans;
}

ll solve(int n){
	int cnt = 0;
	while(n){
		a[cnt++] = n%10;
		n/=10;
	}
	ll ans = 0;
	memset(vis,0,sizeof(vis));
	memset(d,0,sizeof(d));
	int m1=0,m2=0;
	for (int i = cnt-1;i>=0;i--){
		for (int j=0;j<a[i];j++){	//注意,我们求的解不包括n本身
			ans += dp(i,(k-(m1+j)%k+k)%k,(k-(m2+j*pow[i])%k+k)%k); 
		}
		m1 = (m1 + a[i])%k;
		m2 = (m2 + (pow[i] * a[i])%k)%k;
	}
	return ans;
}

void input(){
	scanf("%d%d%d",&x,&y,&k);
	if (k>=100){
		puts("0");
		return ;
	}

	printf("%lld\n",solve(y+1) - solve(x));
}

int main(){
	int t;
//	freopen("1.txt","r",stdin);
	scanf("%d",&t);
	while(t--){
		input();
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
研究双层优化在学习和视觉中的应用,是为了改善学习算法和视觉系统的性能。在学习和视觉任务中,我们通常面临两个层面的优化问题。 第一层优化问题涉及到学习算法的优化,即如何通过合适的学习算法来获得最佳的模型参数。学习算法的优化过程通常涉及到定义损失函数和选择合适的优化方法。然而,常规的优化方法在高维问题中可能会面临挑战,导致在学习过程中陷入局部最优解。因此,研究者们开始探索使用双层优化方法来改进学习算法的性能。双层优化方法通过引入内部优化循环来进一步更新学习算法中的超参数,以改善模型性能。这种方法可以更好地探索参数空间,寻找更优的模型参数,从而提高学习算法的效果。 第二层优化问题涉及到视觉任务的优化,即如何通过图像处理和计算机视觉算法来解决具体的视觉问题。视觉任务可以包括目标检测、图像分割、姿态估计等多个方面。传统的视觉算法通常是通过定义特定的目标函数并使用迭代方法来进行优化。然而,这种方法可能会受到参数选择和初始条件的限制。因此,研究者们开始研究使用双层优化技术来提高视觉任务的性能。双层优化方法通过引入内部优化循环来逐步调整算法超参数和模型参数,以更好地适应特定的视觉任务。 总之,研究双层优化在学习和视觉中的应用,旨在改善学习算法和视觉系统的性能。这种方法可以通过优化学习算法的参数和模型参数,以及优化视觉任务的目标函数和算法参数,来改进学习和视觉的效果。这将有助于在学习和视觉领域取得更好的结果和应用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值