题目链接:
​​​点击打开链接​​​
​​​http://codeforces.com/contest/10/problem/C​​​
题意:
定义d(x)为x的数字根,找出n以内的满足d(z)=d(d(x)⋅d(y))但不满足x⋅y=z这样的x,y,z有多少组?
d(A)是数根,其实就是A%9.
题解:
容斥原理,首先把所有的d(A)d(B)=d(C)的都计算了。
然后减去AB==C且d(A)d(B)=d(C)的,由于显然AB=C,那么d(A)d(B)=d(C).
所以我们只需要减去AB=C的情况就好了。

首先我们能够知道d(x⋅y)=d(d(x)⋅d(y)),那么我们只要找出n以内的数的约数的个数,即n/i就知道了满足条件的情况数,作为ans1。
然后我们通过记录数字根分别是1−9的数的个数,然后直接利用
a[i]∗a[j]∗a[k],其中,(k=i⋅j)
即a[i]∗a[j]∗a[i∗jmod9]
可以计算得到k分为因数i和j的所有情况,作为ans2。
然后用ans2−ans1即可。

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[12];
int main()
{
int n;
ll ans=0;
ll ans1=0,ans2=0;
cin>>n;
for(int i=1;i<=n;i++){
a[i%9]++;
ans1 += n/i;
}
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
ans2 +=a[i]*a[j]*a[i*j%9];
}
}
ans=ans2-ans1;
cout<<ans<<endl;
return 0;
}