10C - Digital Root

原题链接

这是一道不错的数论题

题意:
定义函数\(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;
}
posted @ 2021-04-07 21:24  beatlesss  阅读(43)  评论(0编辑  收藏  举报