首页 > 代码库 > CodeForces 490C Hacking Cypher
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; }
CodeForces 490C Hacking Cypher
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。