CodeForces 490C Hacking Cypher
2015-07-24 11:32
253 查看
给一个数字串,和两个整数a,b。
问能否将该串分成两部分,其前后两部分分别被这两个整数整除。
解法:
根据同余定理,从前往后扫一遍数字串,可以得到各个前缀模a的余数A[i]。再从后往前扫一遍,可以得到各个后缀模b的余数B[i]。然后再扫一遍每一个位置i,看是否有A[i]=B[i+1]=0。
注意,由于不能有前缀0且拆分后得到的数必须大于0,因此在判定A[i]=B[i+1]=0的时候,还需加上s[i+1]!='0'的条件。
问能否将该串分成两部分,其前后两部分分别被这两个整数整除。
解法:
根据同余定理,从前往后扫一遍数字串,可以得到各个前缀模a的余数A[i]。再从后往前扫一遍,可以得到各个后缀模b的余数B[i]。然后再扫一遍每一个位置i,看是否有A[i]=B[i+1]=0。
注意,由于不能有前缀0且拆分后得到的数必须大于0,因此在判定A[i]=B[i+1]=0的时候,还需加上s[i+1]!='0'的条件。
#include<bits/stdc++.h> using namespace std; typedef __int64 LL; char s[1000005]; LL A[1000005],B[1000005]; int main() { LL a,b; int i,j; cin>>s>>a>>b; int l=strlen(s); LL p; A[0]=(s[0]-'0')%a; for(i=1;i<l;++i) A[i]=(A[i-1]*10+s[i]-'0')%a; B[l-1]=(s[l-1]-'0')%b; for(i=l-2,p=1;i>=0;--i){ p=p*10%b; B[i]=(B[i+1]+(s[i]-'0')*p)%b; } bool flag=0; for(i=0;i<l;++i) if(A[i]==0&&i+1<l&&s[i+1]!='0'&&B[i+1]==0){ flag=1;break; } if(flag){ puts("YES"); for(j=0;j<=i;++j) printf("%c",s[j]); puts(""); puts(s+i+1); } else puts("NO"); return 0; }
相关文章推荐
- Docker安装和初始化配置(入门篇)
- IOS UILocalNotification 本地通知
- Chain of Responsibility Pattern
- ubuntu中用户使用的shell如何指定
- NSCondition
- 2015/7/24 (等待回调,结果是盘中回调,盘末拉升,错过了进仓机会吗?详情进入
- 【剑指offer】数组中只出现一次的数字
- iOS 编程 利用UIScrollView 编写无缝循环显示图片
- 全局与局部变量及递归
- 安全令牌
- 九度 oj 1019
- 阿理云主机,跳转绑定二级域名
- nvl() 和nvl2()
- IFTTT开源Swift编写的帧动画框架--RazzleDazzle
- redis集群部署
- 侧滑菜单
- android - EventBus
- Codeforces Round #313 (Div. 2) 解题报告
- Java 8 Stream API详解
- CAVASS使用经验