Digital Count数位统计

本文介绍了一种算法,用于计算在指定范围内所有整数中某一特定数字出现的总次数。通过递归方法预处理不同位数的情况,并利用动态规划思想进行优化。

B -- Digital Count

Time Limit:1s Memory Limit:1024MByte

Submissions:522Solved:117

DESCRIPTION

Given three integers a, b, P, count the total number of digit P appearing in all integers from a to b.

INPUT
The first line is a single integer TT, indicating the number of test cases.
For each test case:
There are only three numbers a,b,Pa,b,P (0≤a≤b≤231-1, 0<P<10).
OUTPUT
For each test cases:
Print the total appearances of digit PP from aa to bb in a single line.
SAMPLE INPUT
2
1 10000 1
1 10 1
SAMPLE OUTPUT
4001
2




思路,预处理1位,2位,3位,...,n位的情况

定义f(i,j)为i开头后面跟着j位的范围为 i*10^j~(i+1)^j-1内p出现的次数

举例来说f(2,1))表示20~29范围内出现p的次数

所以有下列递推式:

当 j ≠ p --> f[ i , j ] = Σ f[ k, j-1 ]k=0..9     

当 j = p --> f[ i , j ] = Σ f[ k, j-1 ]k=0..9 + 10j





AC源码:

#include <iostream>
#include <cstring>
#include <stack>
#include <queue>
#include <cmath>
#include <algorithm>
typedef long long LL;
using namespace std;

const int MAXN=10;
LL f[MAXN][MAXN];

void init(int p)
{
	for(int i=0;i<=9;++i)
		f[i][0]=0;
	for(int j=0;j<=9;++j)
		if(j==p)
			f[j][0]=1;
	for(int j=1;j<=9;++j)
	{
		for(int i=0;i<=9;++i)
		{
			for(int k=0;k<=9;++k)
			{
				f[i][j]+=f[k][j-1];
			}
			if(i==p)
				f[i][j]+=pow(10,j);
		}
	}
}
LL count(int n,int p)
{
	queue<int> que;
	stack<int> stk;
	int num=n;
	while(num>0)
	{
		stk.push(num%10);
		num/=10;
	}
	while(!stk.empty())
	{
		que.push(stk.top());
		stk.pop();
	}
	num=n;
	LL cnt=0;
	while(!que.empty())
	{
		int len=que.size();
		if(len==1)
		{
			for(int i=0;i<=que.front();i++)
				cnt+=f[i][len-1];	
			break;
		}
		for(int i=0;i<=que.front()-1;i++)
			cnt+=f[i][len-1];
		if(que.front()==p)
			cnt+=num-que.front()*pow(10,len-1)+1;
		num=num-que.front()*pow(10,len-1);
		que.pop();
	}
	return cnt;
}

void show()
{
	for(int j=0;j<=9;++j)
	{
		for(int i=0;i<=9;++i)
		{
			cout<<f[i][j]<<" ";	
		}
		cout<<endl;
	}
	
}
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		memset(f,0,sizeof(f));
		int a,b,p;
		cin>>a>>b>>p;
		init(p);
//调试
//		show();
		cout<<count(b,p)-count(a-1,p)<<endl;
	}
	return 0;
}





### 数字灵活伽马调整与实现(Digital Flexible Gamma Adjustment and Implementation in Display Technology) 数字灵活伽马(digital flexible gamma)调整是一种在显示技术中用于优化图像视觉效果的重要手段。该技术允许对显示器的伽马曲线进行动态、精确的调节,以适应不同的内容类型、环境光照条件以及用户偏好。传统的伽马校正通常采用固定的硬件伽马查找表(LUT),而数字灵活伽马则通过软件可编程的方式提供更精细的控制能力,从而实现更高阶的色彩管理和灰阶表现优化[^1]。 在 TFT-LCD 和 AMOLED 显示器中,伽马曲线决定了输入像素值与实际亮度输出之间的非线性关系。为了满足不同应用场景下的视觉一致性要求,现代显示控制器集成了多段式伽马调节机制,支持将伽马曲线划分为多个子区间,并为每个区间单独设置增益系数。这种设计使得在低灰阶区域提升对比度的同时,在高灰阶区域保持平滑的亮度过渡成为可能[^1]。 实现数字灵活伽马的关键在于伽马查找表的位宽和分辨率。例如,在一个 8 位精度的系统中,每段伽马曲线可以配置 256 个不同的电压等级。通过将这些等级映射到源极驱动器的 DAC 输出,能够实现逐点灰阶的精细化控制。以下是一个典型的伽马参数配置代码示例: ```c void configure_gamma_lut(uint16_t *gamma_table, uint8_t segment_count); int main(void) { uint16_t custom_gamma[3][256]; // RGB三通道独立伽马表 generate_custom_gamma_curve(custom_gamma, 2.2f); // 生成标准伽马2.2曲线 configure_gamma_lut(custom_gamma[0], 256); // 红色通道 configure_gamma_lut(custom_gamma[1], 256); // 绿色通道 configure_gamma_lut(custom_gamma[2], 256); // 蓝色通道 enable_digital_gamma_adjustment(); } ``` 上述代码展示了如何在嵌入式显示控制器中配置自定义的伽马曲线。该过程通常涉及调用厂商提供的寄存器接口函数,将计算好的电压映射值写入伽马校正模块。对于支持 HDR 内容渲染的设备,还可以结合局部背光调制(local dimming)技术进一步扩展动态范围[^1]。 此外,为了提高伽马调整的灵活性,一些高端面板采用了基于机器学习的自动校准算法。这些算法能够根据环境传感器采集的亮度与色温信息,实时更新伽马曲线参数,确保在不同光照条件下均能维持一致的视觉体验。例如,在暗光环境下降低整体伽马增益以减少蓝光辐射,在强光下增强中间灰阶对比度以提升可视性[^1]。 在多域电源管理架构中,数字伽马调整还可与功耗优化策略协同工作。例如,在低功耗模式下启用压缩伽马曲线,减少像素充电时间以降低驱动电流需求。这种联合调控方式不仅有助于延长电池续航时间,还能改善 OLED 面板的发光效率衰减问题[^1]。 ### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值