CodeForces 490C Hacking Cypher

来源:互联网 发布:管家婆软件生产教程 编辑:程序博客网 时间:2024/05/16 15:32

题意:

一串数字  从某个地方分开成两个数字  要求前面的数字被A整除  后面的被B整除  求分开的两个数字

思路:

假设我们将原串S这样分成两个数字XY  则X%A==0 Y%B==0

那么我们可以处理从头到i这个位置%A的值为多少  这样很容易判断第一个条件

对于第二个条件我们可以这样理解  S % B == ( X % B * 10^|Y| % B ) + Y % B

如果Y%B==0  那么  S % B == X % B * 10^|Y| % B

所以我们可以处理从头到i这个位置%B的值为多少  和  10的某次幂%B的值为多少  判断i位置是否满足上述等式

注意:Y的第一个字符不能是‘0’

代码:

#include<cstdio>#include<iostream>#include<cstring>#include<string>#include<algorithm>#include<map>#include<set>#include<vector>#include<queue>#include<cstdlib>#include<ctime>#include<cmath>using namespace std;typedef long long LL;#define N 1000010char s[N];LL a, b;int ans;LL A[N], B[N], T[N] = { 1 };int main() {    scanf("%s", s + 1);    cin >> a >> b;    int len = strlen(s + 1);    for (int i = 1; i <= len; i++) {        A[i] = (A[i - 1] * 10 + s[i] - '0') % a;        B[i] = (B[i - 1] * 10 + s[i] - '0') % b;        T[i] = T[i - 1] * 10 % b;    }    ans = 0;    for (int i = 2; i <= len; i++) {        if (s[i] != '0' && A[i - 1] == 0) {            if (B[i - 1] * T[len - i + 1] % b == B[len]) {                ans = i;                break;            }        }    }    if (ans) {        puts("YES");        for (int i = 1; i <= len; i++) {            if (i == ans)                putchar('\n');            putchar(s[i]);        }    } else        puts("NO");    return 0;}


0 0
原创粉丝点击