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;
}