51nod1116-取模&大数-K进制下的大数

来源:互联网 发布:怎么淘宝介入 编辑:程序博客网 时间:2024/05/20 12:48

https://www.51nod.com/onlineJudge/submitDetail.html#!judgeId=300218
开始是模拟计算,后来感觉这么长的位置可能会爆。
后来想了一个方法,每次先求位权。一位一位的算。
比如4872%21
先算 4*1000 mod21为 18
18+800 mod 21
依次。但是又wa了好多组。。。这样应该也会爆。
其实已经很像了。。。但是没有发现,就是手工模拟取模的过程,分位次取模。。额。

#include <iostream>#include <cstdio>#include <cstdlib>#include <map>using namespace std;typedef long long ll;map<char,int>mp;int main(){  string s;    while(cin>>s){         int max1=-1;         int max2=-1;         bool flag=false;         bool kk=false;         for(int i=0;i<s.length();i++){             if(s[i]>='A'&&s[i]<='Z')                {flag=true;                 max2=max(max2,s[i]-'A');                }              else if(s[i]>='0'&&s[i]<='9')                    max1=max(max1,s[i]-'0');         }         if(!flag){         for(int i=max1+1;i<=36;i++){            ll k=1;             ll sum=0;             for(int j=0;j<s.length();j++){                sum=sum*i+1ll*(s[j]-'0');                sum%=(i-1);                }             if(!sum)             {printf("%d\n",i);kk=true;break;}         }         }         else{             for(int i=max2+11;i<=36;i++){                ll  k=1;                ll sum=0;                for(int j=0;j<s.length();j++){                    if(s[j]>='0'&&s[j]<='9')                    sum =1ll*(s[j]-'0')+sum*i;                   else                      sum=1ll*(s[j]-'A'+10)+sum*i;                      sum%=(i-1);                      }                 //if(i==22)                    //cout<<sum<<"@@@@"<<endl;                if(!sum)                    {printf("%d\n",i);                      //cout<<"!!"<<max2+11<<endl;                      //cout<<sum<<endl;                      //cout<<(i-1)<<endl;                      kk=true;                     break;}             }         }         if(!kk)            puts("No solution");    }    return 0;}
原创粉丝点击