Your team was exploring an ancient city. Suddenly you found an old scroll with 2 integer numbersN and K, which encrypts the secret code to open a treasure box. Considering a transformation on an integerX described as follows:
X = X + X mod 100,
the secret code can be obtained by applying the above-described transformationK times successively to N.
The input file consists of several datasets. The first line of the input file contains the number of datasets which is a positive integer and is not greater than 500.
Each dataset has two space-separated positive integers N and K (1 ≤ N ≤ 109, 1 ≤ K ≤ 109) written on a single line.
For each dataset, write on a single line the secret number decrypted from N and K.
2 31102014 2 10101 10
31102056 10324
解析
非常简单的数学题,模100显然只有0~99种余数,那么最坏100次必然找到循环节。进位就看循环节的个数。
注意用long long
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long LL;
int flag[100];
LL K,N;
vector<LL> add;
void work()
{
memset(flag,-1,sizeof(flag));
add.clear();
LL p;
add.push_back(N);//time=0
flag[(int)(add[0]%100)]=0;
int start=-1;
for(int i=1;i<=K;i++)
{
p=add[i-1]+add[i-1]%100;
if(flag[(int)(p%100)]!=-1) {start=flag[(int)(p%100)]; break;}
else flag[(int)(p%100)]=i;
add.push_back(p);
}
LL loop=add.size()-start;
if(start==-1) {printf("%I64d\n",N+add[add.size()-1]-add[0]);return;}
N=add[start];K-=start;
printf("%I64d\n",(K/loop)*(p-add[start])+add[start+K%loop]);
}
int main()
{
int T; scanf("%d",&T);
for(int i=1;i<=T;i++)
{
scanf("%I64d%I64d",&N,&K);
work();
}
return 0;
}