这道题就是求[1,n]内,能被m整除的数的个位数的和为多少;题意很简单吧,嘻嘻;但是一看1e16;枚举早爆了;
所以我猜了一下应该是什么规律;
后面我发现这个问题如果一个数x能被m整除;那么x的值可以为m,2m,3m,4m,…;
我发现是等差数列;也就是x=num*m(num>=1的整数);
然后我写了一下样例;发现这个问题:
我把个位数保留下来;可以发现这个东西是以10为周期的;之后我又写了1337,和14。。。。发现都是以10为周期;而且有数论知识我可以知道[1,n]内能被m整除的个数就是n/m个;那么我就可以先把10个求出来,然后再来看n/m的个数问题了;所以这个题就AC了;
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll T,n,m;
ll save[20];
int main(){
scanf("%lld",&T);
while(T--){
scanf("%lld %lld",&n,&m);
if(m>n){///如果m>n了那么没有数,就是0了
puts("0");
}else{
ll num=n/m,t1=0,t2=0;
for(int i=1;i<=10;i++){
save[i]=(m*i)%10;//用save来保存10个尾数
t1+=(m*i)%10;//记录一个周期的和
}
for(int i=1;i<=num%10;i++){///记录多余的数的和
t2+=(m*i)%10;
}
printf("%lld\n",t1*(num/10)+t2);//(num/10)表示有多少个周期,然后t2是多余的数;
}
}
return 0;
}