CodeForces 490C Hacking Cypher

题意:

一串数字  从某个地方分开成两个数字  要求前面的数字被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 1000010

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


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值