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
代码
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
#include <map>
using namespace std; typedef long long ll;
map< ll ,ll > done;
map<ll ,int > mp;
const ll MOD=1e9+;
const int maxLen=1e6+;
char s[maxLen];
ll P[maxLen];
ll sum[maxLen]; template<class T>
inline bool scan_d(T &ret){
char c; int sgn;
if(c=getchar(),c==EOF) return ;//EOF
while(c!='-'&&(c<''||c>'')) c=getchar();
sgn=(c=='-')?-:;
ret=(c=='-')?:(c-'');
while(c=getchar(),c>=''&&c<='') ret=ret*+(c-'');
ret*=sgn;
return ;
} inline void out(int x){
if(x>) out(x/);
putchar(x%+'');
} ll gcd(ll a,ll b){
return b==?a:gcd(b,a%b);
} ll Qpow(ll a,ll n){
ll ret=;
ll tmp=a%MOD;
while(n){
if(n&) ret=(ret*tmp)%MOD;
tmp=(tmp*tmp)%MOD;
n>>=;
}
return ret;
} ll getF(ll t){
if(t==) return mp[t]=;
if(mp.count(t)) return mp[t];
mp[t]=Qpow(,t-);
for(int i=;i*i<=t;++i){
if(t%i==){
mp[t]=(mp[t]-getF(i)+MOD)%MOD;
if(i*i!=t) mp[t]=(mp[t]-getF(t/i)+MOD)%MOD;
}
}
return mp[t]=(mp[t]-getF()+MOD)%MOD;
} int main()
{
P[]=;
for(int i=;i<maxLen;++i){
P[i]=P[i-]*%MOD;
}
scanf("%s",s+);
int len=strlen(s+);
sum[]=;
for(int i=;i<=len;++i){
sum[i]=(sum[i-]*+s[i]-'')%MOD;
}
//for(int i=1;i<=len;++i)
// printf("%d : %I64d\n",i,sum[i]);
int flag=;
for(int i=len/;i<len;++i){
if(s[i+]==''&&len-i>) continue;
int sumlen=len-i;
for(int j:{sumlen,sumlen-,i-sumlen,i-sumlen+}){
if(j>=i||j<) continue;
if(s[j+]==''&&i-j>) continue; //printf("i : %d j : %d\n",i,j);
ll a=(sum[j]-sum[]*P[j]%MOD+MOD)%MOD;
ll b=(sum[i]-sum[j]*P[i-j]%MOD+MOD)%MOD;
ll c=(sum[len]-sum[i]*P[len-i]%MOD+MOD)%MOD;
if((a+b)%MOD==c%MOD){
for(int k=;k<=j;++k)
putchar(s[k]);
putchar('+');
for(int k=j+;k<=i;++k)
putchar(s[k]);
putchar('=');
for(int k=i+;k<=len;++k)
putchar(s[k]);
puts("");
flag=;
break;
}
}
if(flag) break;
}
return ;
}
F - Restoring the Expression CodeForces - 898F的更多相关文章
- Codeforces Round #451 (Div. 2) [ D. Alarm Clock ] [ E. Squares and not squares ] [ F. Restoring the Expression ]
PROBLEM D. Alarm Clock 题 OvO http://codeforces.com/contest/898/problem/D codeforces 898d 解 从前往后枚举,放进 ...
- codeforces 898F Hash
F. Restoring the Expression time limit per test 2 seconds memory limit per test 256 megabytes input ...
- Codeforces 898F - Restoring the Expression(字符串hash)
898F - Restoring the Expression 思路:字符串hash,base是10,事实证明对2e64取模会T(也许ull很费时),对1e9+7取模. 代码: #include< ...
- Contest Round #451 (Div. 2)F/Problemset 898F Restoring the Expression
题意: 有一个a+b=c的等式,去掉两个符号,把三个数连在一起得到一个数 给出这个数,要求还原等式,length <= 1e6 三个数不能含有前导0,保证有解 解法: 铁头过题法,分类然后各种判 ...
- F - Make It Equal CodeForces - 1065C
题目大意:有n座塔,塔高h[i],每次给定高度H对他们进行削切,要求每次削掉的所有格子数不能超过k个,输出最少削几次才能使所有塔的高度相同. 思路一:差分+贪心 对于每一个高度h,用一个数组让1~h的 ...
- Codeforces 884f F. Anti-Palindromize
题 OvO http://codeforces.com/contest/884/problem/F (Educational Codeforces Round 31 - F) 884f 解 题目标签 ...
- Codeforces 731 F. Video Cards(前缀和)
Codeforces 731 F. Video Cards 题目大意:给一组数,从中选一个数作lead,要求其他所有数减少为其倍数,再求和.问所求和的最大值. 思路:统计每个数字出现的个数,再做前缀和 ...
- Codeforces Round# 305 (Div 1)
[Codeforces 547A] #include <bits/stdc++.h> #define maxn 1000010 using namespace std; typedef l ...
- Expression Trees
Expression Trees 只是想简单说下表达式树 - Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译 ...
随机推荐
- 500G JAVA视频网盘分享 (JEECG开源社区)
500 G JAVA视频网盘分享(JEECG开源社区) [涵盖从java入门到深入架构,Linux.云计算.分布式.大数据Hadoop.ios.Android.互联网技术应有尽有] J ...
- C++11并发之std::thread<转>
最近技术上没什么大的收获,也是悲催的路过~ 搞一点新东西压压惊吧! C++11并发之std::thread 知识链接: C++11 并发之std::mutex C++11 并发之std::atomic ...
- js修改table中Td的值(定义td的单击事件)
/* 页面装载时,为每个td增加单击事件,这样,就可以不用对每个页面进行更改. 添加单击事件属性.此处不可使用setAttribute方法. */ onclick=AddObjOfText; 单击事件 ...
- pycharm 对数据库进行可视化操作
https://blog.csdn.net/qq_24189933/article/details/75666243
- linux 常用命令记录&& xsheel 使用记录
cp -r x1 x2 复制文件x1到x2 ls 当前目录下的文件列表 ll ...
- ADO.NET基础知识
ADO.NET定义 ADO是ActiveX Data Objects的缩写,ADO.NET是数据库应用程序和数据源之间沟通的桥梁,主要提供一个面向对象的数据访问架构,用来开发数据库应用程序,就是一组类 ...
- 如何在Windows下安装MYSQL,并截图说明
说明 : window 下安装 mysql 虽然简单,但是细节不注意就会安装失败,特别是配置服务器时,Current Root Password:为空:如果输入密码了在后面安装会报错.(不知道设置这个 ...
- Android Studio 打包时 Signature Version 选择V1还是V2 ?
只勾选V2会导致 7.0 以下的安卓机出现 INSTALL_PARSE_FAILED_NO_CERTIFICATES 的问题 ,推荐全选. 解决方案一v1和v2的签名使用1)只勾选v1签名并不会影响什 ...
- 浏览器唤起APP的思路(本文转载)
在做 h5 页面中,会遇到这样一个需求,有一个立即打开的按钮,如果本地安装了我们的 app,那么点击就直接唤起本地 app,如果没有安装,则跳转到下载. 首先想到的是两个问题:一是如何唤起本地 app ...
- C++ 动态创建按钮及 按钮的消息响应
动态创建的按钮 都会在消息 OnCommand 中得到处理,无论是什么消息,都会处理的 1\创建按钮 CButton* btn = new CButton(); btn->Create(_T(, ...