学校oj题目二(枚举+求模+比较)

来源:互联网 发布:哈希map java 编辑:程序博客网 时间:2024/06/07 03:42

Description

夏天蚊子真多,睡不着,怎么办呢?小贤我没办法,只好坐在桌前发呆,拿着笔乱画,无意义的计算着,醒悟过来的时候,发现我算了好几个数字出来,很长很长,不过我隐约记得我是在计算N^N不过我不知道N是多少了,同时,数字也有些模糊不清,但还好,数字的位数不会出错。也就是如果我计算的是3^3=27,我可能写成了29或20之类的,但不会多或者少一位。

     现在我想让你帮我看看我算的N到底是多少。

Input

输入样例有多组,每组一行,是一个N^N的值,一行中皆为0~9的字符,无空格(0<N<10000)。

Output

对于每组样例,输出一行,如果该数字是N^N则输出N的值,否则输出NO

Sample Input

2729285311670611

Sample Output

3NO11

HINT

//思想:n^n最大会达到10000位,我们可以采取取模降低其位数,再枚举1-10000的n^n的值+快速幂求得答案

//code

#include<string>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<math.h>
#include<sstream>
#include<cstdlib>
#include<iomanip>
#define ll long long
using namespace std;
const int MOD=1e9+7;
ll quickPow(ll a,ll b){//快速幂
    ll res=1;
    while(b){
        if(b&1)res=(res*a)%MOD;//注意对结果求了模,避免其值过大
        b=b>>1;
        a=(a*a)%MOD;//每升高一位,实际上就做了一个平方运算
    }
    return res;
}
int main(){
    ll value[10005];
    string str;//先用字符串存数据
    ll r;
    short res;
    bool flag;
    for(short i=1;i<=10000;i++)
        value[i]=quickPow(i,i);//存放所有平方值
    while(cin>>str){
        r=0;
        for(short i=0;i<str.length();i++)
            r=(r*10+str[i]-'0')%MOD;//将其值转化为long long
        flag=false;
        res=-1;
        for(short i=1;i<=10000;i++)
        {
            if(value[i]==r){
                flag=true;
                res=i;
                break;
            }
        }
        if(flag)cout<<res<<endl;
        else cout<<"NO"<<endl;
    }
}




0 0