标签:codeforces 数学
题意:
一串数字 从某个地方分开成两个数字 要求前面的数字被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; }
CodeForces 490C Hacking Cypher
标签:codeforces 数学
原文地址:http://blog.csdn.net/houserabbit/article/details/41440871