Problem C: 魔幻任务
Description
数字47一向被数学界的人认为是很魔幻的一个数字,和47有关的任务被认为是魔幻任务。某天,doubleegg正在做着这类魔幻任务,路过的奇牛看到了,他说,你研究了老半天,研究出了什么?我来问你个简单的问题,我想知道长度为n位能够被47整除最小的数,你会吗?会吗?吗??由于doubleegg已经被奇牛的气场震晕过去,所以这个魔幻任务只能交给你了,聪明的你,一定想得到的。
Input
第一行输入一个样例数T(T<=1000)
下面每一行输入一个n(n<=10000)
Output
每一行输出一个答案,假设不存在,输出-1
Sample Input
1
2
Sample Output
47
//如果n更大的话可以采用快速幂取模
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <vector>
#include <cstdio>
#include<map>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include<set>
#include <iostream>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define inf -0x3f3f3f3f
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define mem(a, b) memset(a, b, sizeof(a))
typedef long long ll;
int main(){
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
if(n<=2){
if(n<=0)
printf("-1\n");
if(n==1)
printf("0\n");
if(n==2)
printf("47\n");
}
else{
int ans=1;
for(int i=0;i<n-1;i++){//循环n-1次
ans=ans*10;
ans=ans-ans/47*47;
}
printf("1");
for(int i=1;i<n-2;i++)
printf("0");
if(47-ans<10)
printf("0%d\n",47-ans);
else
printf("%d\n",47-ans);
}
}
return 0;
}
/*
题解:
首先,分析可以知道当n>=3时,长度为n位能够被47整除最小的数一定只有最后两位和第一位(第一位为1)不为0,
所以只要计算出最后两位应该是多少便可以了
我们可以计算出,当数位10000...0000(有n-1个0)时,对47取模的答案是多少,
然后只要最后两位更改为47-ans便可以了
*/