F - Restoring the Expression CodeForces - 898F
Posted kiritsugu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ",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 ",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 }
以上是关于F - Restoring the Expression CodeForces - 898F的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #451 (Div. 2)F. Restoring the Expression 字符串hash