jzoj2700-數字【數論,LCM】
阿新 • • 發佈:2019-01-05
正題
luogu題目連結:https://www.luogu.org/problemnew/show/P4193
題目大意
定義一個函式
和
,
表示
的各位之和
求
之間有多個
滿足
解題思路
因為
,所以
若一個數
,那麼
證明:
證畢
然後之間根據迴圈節預處理 的就好了
#include<cstdio>
#define LCM 22680
#define ll long long
using namespace std;
ll n,f[1000000],ans;
ll D(ll x)
{return (x-1)%9+1;}
ll ask(ll x)//1~x的個數
{return x/LCM*ans+f[x%LCM];}
int main()
{
scanf("%lld",&n);
for(ll i=1;i<=LCM;i++)//預處理
{
for(ll j=1;j<=9;j++)
if(D(i/j)==j&&i%j==0){
f[i]=1;
ans++;
break;
}
f[i]+=f[i-1];
}
while(n--)
{
ll l,r;
scanf("%lld%lld",&l,&r);
printf("%lld\n",ask(r)-ask(l-1));
}
}