社区讨论

解释一下之前的算法,我不是暴力撸的,时间复杂度会小。

P1980[NOIP 2013 普及组] 计数问题参与者 5已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@mi86460r
此快照首次捕获于
2025/11/21 09:14
4 个月前
此快照最后确认于
2025/11/21 09:14
4 个月前
查看原帖
#include using namespace std;
int main() { int x; long long m,N = 0,n; cin >> n >> x;
CPP
if (x != 0)
{
	if (n % 10 >= x)
		N = N + n / 10 + 1;//个位
	else
		N = N + n / 10;

	for (m = 10; m <= 1e8; m = m * 10)//以m来表示位数
	{

		if ((n % (m * 10)) / m >= x)//当m位大于等于x事
		{
			if ((n %(m * 10)) / m == x)//等于时
				N = N +n/(m*10)*m+ n % m + 1;//n位以上的值乘以m并加上多余量
			else
				N = N + (n / (m * 10) + 1) * m;//n位以上值加一乘以m
		}
		else
			N = N + n / (m * 10) * m;//n位以上乘以m
	}
}
if (x == 0)//零的最大区别是每一位都要少算一次
{
	if (n / 10 == 0)
		N = 0;
	for (m = 10; m <= 1e8; m = m * 10)
	{
		if (n % (m * 10) /m != 0 || n/m!=0)
		{
			if (n % m / (m / 10) != 0)
				N = N + n / m * (m / 10);
			else
				N = N + (n / m - 1) * (m / 10) + n % (m / 10) + 1;
		}
	}
}
cout << N;
return 0;
}

回复

7 条回复,欢迎继续交流。

正在加载回复...