F - Restoring the Expression CodeForces - 898F

字符串hash:  base设置为10

枚举'='可能出现的位置,从1/2处开始到大概1/3处结束,当然大概的1/3不用计算,直接到最后就行,因为本题必然有解,输出直接结束即可。

根据'='号位置,'+'最多有四种位置,因为 等式的和位数确定,有进位和不进位,左和右,最多2X2,然后剪掉j的非法位置(这里没计算除了len=3以外的j有无非法位置的可能,剪了再说)

比较需要注意的地方是等式中非个位数字不能以'0'开头,开始只以为不以'0'开头即可,WA在了 1+0=0 ,改了j后又WA了0+0=0

代码

  1 #include <iostream>
  2 #include <cmath>
  3 #include <algorithm>
  4 #include <vector>
  5 #include <cstring>
  6 #include <queue>
  7 #include <map>
  8 using namespace std;
  9 
 10 typedef long long ll;
 11 map< ll ,ll > done;
 12 map<ll ,int > mp;
 13 const ll MOD=1e9+7;
 14 const int maxLen=1e6+3;
 15 char s[maxLen];
 16 ll P[maxLen];
 17 ll sum[maxLen];
 18 
 19 template<class T>
 20 inline bool scan_d(T &ret){
 21     char c; int sgn;
 22     if(c=getchar(),c==EOF) return 0;//EOF
 23     while(c!='-'&&(c<'0'||c>'9')) c=getchar();
 24     sgn=(c=='-')?-1:1;
 25     ret=(c=='-')?0:(c-'0');
 26     while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
 27     ret*=sgn;
 28     return 1;
 29 }
 30 
 31 inline void out(int x){
 32     if(x>9) out(x/10);
 33     putchar(x%10+'0');
 34 }
 35 
 36 ll gcd(ll a,ll b){
 37     return b==0?a:gcd(b,a%b);
 38 }
 39 
 40 ll Qpow(ll a,ll n){
 41     ll ret=1;
 42     ll tmp=a%MOD;
 43     while(n){
 44         if(n&1) ret=(ret*tmp)%MOD;
 45         tmp=(tmp*tmp)%MOD;
 46         n>>=1;
 47     }
 48     return ret;
 49 }
 50 
 51 ll getF(ll t){
 52     if(t==1) return mp[t]=1;
 53     if(mp.count(t)) return mp[t];
 54     mp[t]=Qpow(2,t-1);
 55     for(int i=2;i*i<=t;++i){
 56         if(t%i==0){
 57             mp[t]=(mp[t]-getF(i)+MOD)%MOD;
 58             if(i*i!=t) mp[t]=(mp[t]-getF(t/i)+MOD)%MOD;
 59         }
 60     }
 61     return mp[t]=(mp[t]-getF(1)+MOD)%MOD;
 62 }
 63 
 64 int main()
 65 {
 66     P[0]=1;
 67     for(int i=1;i<maxLen;++i){
 68         P[i]=P[i-1]*10%MOD;
 69     }
 70     scanf("%s",s+1);
 71     int len=strlen(s+1);
 72     sum[0]=0;
 73     for(int i=1;i<=len;++i){
 74         sum[i]=(sum[i-1]*10+s[i]-'0')%MOD;
 75     }
 76     //for(int i=1;i<=len;++i)
 77     //    printf("%d : %I64d\n",i,sum[i]);
 78     int flag=0;
 79     for(int i=len/2;i<len;++i){
 80         if(s[i+1]=='0'&&len-i>1) continue;
 81         int sumlen=len-i;
 82         for(int j:{sumlen,sumlen-1,i-sumlen,i-sumlen+1}){
 83             if(j>=i||j<1) continue;
 84             if(s[j+1]=='0'&&i-j>1) continue;
 85 
 86         //printf("i : %d   j : %d\n",i,j);
 87             ll a=(sum[j]-sum[0]*P[j]%MOD+MOD)%MOD;
 88             ll b=(sum[i]-sum[j]*P[i-j]%MOD+MOD)%MOD;
 89             ll c=(sum[len]-sum[i]*P[len-i]%MOD+MOD)%MOD;
 90             if((a+b)%MOD==c%MOD){
 91                 for(int k=1;k<=j;++k)
 92                     putchar(s[k]);
 93                 putchar('+');
 94                 for(int k=j+1;k<=i;++k)
 95                     putchar(s[k]);
 96                 putchar('=');
 97                 for(int k=i+1;k<=len;++k)
 98                     putchar(s[k]);
 99                 puts("");
100                 flag=1;
101                 break;
102             }
103         }
104         if(flag) break;
105     }
106     return 0;
107 }
View Code

猜你喜欢

转载自www.cnblogs.com/Kiritsugu/p/9321192.html