#10 C. Digital Root (数论)

来源:互联网 发布:vm数据区 编辑:程序博客网 时间:2024/06/05 06:43

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

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

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