gdut月赛C: 魔幻任务

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便可以了
*/


你可能感兴趣的:(gdut月赛C: 魔幻任务)