CodeForces 490C Hacking Cypher

给一个数字串,和两个整数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;
}


你可能感兴趣的:(CodeForces 490C Hacking Cypher)