#计数#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);
}

猜你喜欢

转载自www.cnblogs.com/Spare-No-Effort/p/12165572.html