Codeforces 1213C Book Reading
## 中文题意
多组数据,每组给一个n给一个m,要求正整数\(1\)~\(n\)中,所有能被m整除的数的个位之和。
解题思路
首先,能被m整除的数的数量是\(\lfloor\frac{n}{m}\rfloor\),手算一下(或者打表)可以发现能被m整除的数的个位会循环,循环节长度只和m的个位有关,循环节具体情况见代码。然后没了……
源代码
#include<cstdio>
#include<algorithm>
int T;
long long n,m;
int temp[12][12]={//temp[i][0]代表的是循环节长度
{1,0},
{10,1,2,3,4,5,6,7,8,9,0},
{5,2,4,6,8,0},
{10,3,6,9,2,5,8,1,4,7,0},
{5,4,8,2,6,0},
{2,5,0},
{5,6,2,8,4,0},
{10,7,4,1,8,5,2,9,6,3,0},
{5,8,6,4,2,0},
{10,9,8,7,6,5,4,3,2,1,0}
};
int main()
{
// freopen("test.in","r",stdin);
scanf("%d",&T);
for(int i=0;i<10;i++)
{
for(int j=2;j<=temp[i][0];j++)
{
temp[i][j]+=temp[i][j-1];
}
}
while(T--)
{
scanf("%lld%lld",&n,&m);
long long num=n/m;
m%=10;
long long ans=temp[m][temp[m][0]];//一整个循环节
ans*=num/temp[m][0];
num%=temp[m][0];
if(num) ans+=temp[m][num];
printf("%lld\n",ans);
}
return 0;
}