首页 > 其他 > 详细

10C - Digital Root

时间:2021-04-07 23:08:55      阅读:21      评论:0      收藏:0      [点我收藏+]

原题链接https://codeforces.com/problemset/problem/10/C

这是一道不错的数论题

题意:
定义函数\(d(x)\)\(x\)的数字根,即若\(x≤9\),则\(d(x)=x\);否则\(d(x)=d(s(x))\),其中\(s(x)\)\(x\)的各位数之和

问存在多少三元组\((A,B,C)\)满足\(A,B,C∈[1,N]\)\(d(C)=d(d(A)d(B))\)\(C≠AB\)

思路:首先就是对于\(i∈[1,N]\)如何计算\(d(x)\),当然可以用最粗暴的方法,取每一个数位,然后判断,一直到小于9为止。但如果能看出\(d(x)=(x?1)%9+1\),那就最好不过了。
然后用cnt数组统计每个数值的\(d(x)\)的数量。 满足\(d(C)=d(d(A)d(B))\)的三元组数目即\(cnt[d(A)] * cnt[d(B)] * cnt[d(A)d(B)]\),因此我们枚举AB即可。
然后去掉三元组中满足 \(C = A * B\)的数目,这个数目即\([1,N]\)中每个数的因子数之和。

ll cnt[10];


int main()
{
	IOS;
	int n;
	cin >> n; 
	for(int i = 1 ; i <= n ; i ++) cnt[(i - 1) % 9 + 1] ++;
	
	ll res = 0;
	for(int i = 1 ; i <= 9 ; i ++)
		for(int j = 1 ; j <= 9 ; j ++)
			res += cnt[i] * cnt[j] * cnt[(i * j - 1) % 9 + 1];
	
	for(int i = 1 ; i <= n ; i ++) res -= n / i;
		
	cout << res;

	return 0;
}

10C - Digital Root

原文:https://www.cnblogs.com/luoyicong/p/14629661.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!