Book Reading
题目链接:http://codeforces.com/contest/1213
Polycarp is reading a book consisting of n pages numbered from 1 to n. Every time he finishes the page with the number divisible by m, he writes down the last digit of this page number. For example, if n=15 and m=5, pages divisible by m are 5,10,15. Their last digits are 5,0,5 correspondingly, their sum is 10.
Your task is to calculate the sum of all digits Polycarp has written down.
You have to answer q independent queries.
Input
The first line of the input contains one integer q (1≤q≤1000) — the number of queries.
The following q lines contain queries, one per line. Each query is given as two integers n and m (1≤n,m≤1e16) — the number of pages in the book and required divisor, respectively.
Output
For each query print the answer for it — the sum of digits written down by Polycarp.
Example
Input
7
1 1
10 1
100 3
1024 14
998244353 1337
123 144
1234312817382646 13
Output
1
45
153
294
3359835
0
427262129093995
题目大意:
输入一个数q,表示循环的次数,在每次循环中输入两个数n和m,要求在1~n的范围内,计算m的倍数的个位数之和并输出。若m大于n,输出0.
思路分析:
以上基本上包含了对于题目的分析,就是在1~n的范围内找到m的倍数,然后将它们的个位数相加得到结果,若m大于n,结果为0。
注意:
不要一直使用for循环寻找m的倍数,然后求出它的个位数,当n很大的时候,你会发现程序运行半天都没有结果,此路不通!但是该怎么做呢?
具体分析:
假如n为45,m为5,那么在1~45这个范围内,5的倍数为:5,10,15,20,25,30,35,40,45,再来看这些数的个位数,分别是:5,0,,5,0,5,0,5,0,5。发现规律了没有!5,0循环重复出现!循环的长度为2。所以问题就有了突破口,使用for循环(这个循环最多有n/m次)查找m的倍数,然后开一个数组记录每次出现的个位数,同时声明一个变量len来记录这个循环长度并计算这些个位数之和存到sum中,当某个数字重复出现时就退出for循环。接下来就是计算能有多少个这样的循环,计算出次数并乘以刚刚计算出来的sum,并将这个数值赋给sum.可能这时候还有漏网之鱼,就像上面举的例子里面的最后一个5,这时候就要将构不成一个个位数出现规律循环的数加在sum中,然后输出。分析结束!
代码:
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
long long int n,m; //n为书的页数,m表示每读m页就记录一次个位数
int q; //总循环的次数
int i,j; //控制循环
int s[50]; //记录循环过的数据
int a[50]; //记录循环过的次数
int main()
{
cin>>q;
while(q--){
memset(s,0,sizeof(s)); //初始化数组,每循环一次就要清空一下数组,要不然就凉了
memset(a,0,sizeof(a)); //初始化数组
long long int sum=0; //记录数据之和
int temp=0; //记录个位数
int len=0; //记录循环的长度
cin>>n>>m;
long long int cs=n/m; //cs表示共可循环多少次
if(m>n)
{
cout<<0<<endl;
continue;
}
else{
for(i=1;i<=cs;i++){
temp=(m*i)%10;
s[i]=temp;
a[temp]++;
if(a[temp]==2)
break;
sum+=temp;
len++;
}
}
sum*=(cs/len);
if(cs/len!=0){
for(i=1;i<=cs%len;i++)
sum+=s[i];
}
cout<<sum<<endl;
}
return 0;
}