Codeforces Round #582 (Div. 3) C. Book Reading
题意:
给你n,k。表示在[1,n]这个区间内,在这个区间内找出来所有x满足x%k==0,然后让所有x的个位加到一起(即x%10),输出。
例如:输入10 2
那么满足要求的数是2 4 6 8 10
那么2%10+4%10+6%10+8%10+10%10=20
那么就输出20
题解:
满足x%k==0的x,肯定是k与某个因数y的乘积,即1*k,2*k,3*k,4*k....... (y<=n/k)
我们发现11*k这个数的个位和1*k的个位相同,即(11*k)%10==(1*k)%10
那么肯定也有(21*k)%10==(1*k)%10...............
所以我们只需要找出来所有(i*k)%10 (1<=i<=9) 然后加到一起
然后看一下y是多少,弄一下就可以了,具体看代码吧!
代码:
1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 const int maxn=15; 7 typedef long long ll; 8 ll v[maxn],sum[maxn]; 9 int main() 10 { 11 ll t; 12 cin>>t; 13 while(t--) 14 { 15 ll n,m; 16 cin>>n>>m; 17 18 for(ll i=1;i<=9;++i) 19 v[i]=(i*m)%10,sum[i]=sum[i-1]+v[i]; 20 if(n<m) 21 { 22 printf("0\n"); 23 continue; 24 } 25 n/=m; 26 m%=10; 27 ll summ=0,ans; 28 ans=n/10; 29 ll q=n%10; 30 //printf("%d %lld %d\n",n,ans,q); 31 summ=ans*sum[9]; 32 summ+=sum[q]; 33 printf("%I64d\n",summ); 34 } 35 return 0; 36 }