题目链接:
点击打开链接
http://codeforces.com/contest/10/problem/C
题意:
定义
d(x)
为
x
的数字根,找出
d(A)
是数根,其实就是
A
%9.
题解:
容斥原理,首先把所有的
然后减去
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
以内的数的约数的个数,即
然后我们通过记录数字根分别是
1−9
的数的个数,然后直接利用
a[i]∗a[j]∗a[k],其中,(k=i⋅j)
即
a[i]∗a[j]∗a[i∗jmod9]
可以计算得到
k
分为因数
然后用
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;
}