CodeForces 490C Hacking Cypher

来源:互联网 发布:网络投资平台最赚钱 编辑:程序博客网 时间:2024/05/21 06:25

给一个数字串,和两个整数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'的条件。


#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;}


0 0
原创粉丝点击