#计数#CF10C Digital Root
题目
定义\(d(x)\)为\(x\)的数位和嵌套,直至\(0\leq d(x)<10\)
询问在\([1\sim n]\)中有多少个三元组\((a,b,c)\)满足
\[ab\neq c,d(d(a)\cdot d(b))=d(c)
\]
分析
\(d(x)=x \bmod 9\),那么\(d(d(a)\cdot d(b))=a*b\bmod 9=c\bmod 9\)
首先\(ab\neq c\)不容易处理,考虑容斥
也就是用\(a*b\bmod 9=c\bmod 9\)的方案数减去\(a*b=c\)的方案数
首先第一部分可以统计\([1\sim n]\)中余数为\([0\sim 8]\)的个数,那么两重循环就能解决
后面这坨就是相当于对于每个\(c\)求\(c\)的约数个数,因为确定\(a,c\),那么\(b\)也是可以确定的,那也就是求\([1\sim n]\)的约数个数和,也就是$$\sum_{i=1}^n\lfloor\frac{n}{i}\rfloor$$
所以\(O(n)\)解决
代码
#include <cstdio>
#define rr register
using namespace std;
typedef long long lll;
lll n,ans,d[9];
signed main(){
scanf("%lld",&n);
for (rr int i=1;i<=n;++i) ans-=n/i,++d[i%9];
for (rr int i=0;i<9;++i)
for (rr int j=0;j<9;++j)
ans+=d[i]*d[j]*d[i*j%9];
return !printf("%lld",ans);
}