1 条题解
-
0
JAVA题解:
import java.io.*; import java.math.BigInteger; import java.util.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String s = br.readLine().trim(); String[] parts = br.readLine().trim().split(" "); int a = Integer.parseInt(parts[0]); int b = Integer.parseInt(parts[1]); solve(s, a, b); } public static void solve(String s, int a, int b) { int n = s.length(); // 计算前缀余数 pref[i] = s[:i] mod a int[] pref = new int[n + 1]; for (int i = 1; i <= n; i++) { pref[i] = (pref[i - 1] * 10 + (s.charAt(i - 1) - '0')) % a; } // 计算后缀余数 suf[i] = s[i:] mod b int[] suf = new int[n + 1]; long p = 1; // 当前位权 for (int i = n - 1; i >= 0; i--) { suf[i] = (int)((s.charAt(i) - '0') * p + suf[i + 1]) % b; p = (p * 10) % b; } // 从右向左枚举切割点,找到第一个满足条件的切割点 for (int i = n - 1; i > 0; i--) { // 后半部分不能有前导零 if (s.charAt(i) == '0') { continue; } // 检查两部分是否分别能被a和b整除 if (pref[i] == 0 && suf[i] == 0) { System.out.println("YES"); System.out.println(s.substring(0, i)); System.out.println(s.substring(i)); return; } } // 没有找到合适的切割点 System.out.println("NO"); } // 用于处理大整数的辅助方法 public static String[] solveWithBigInteger(String s, int a, int b) { int n = s.length(); // 从右向左枚举切割点 for (int i = n - 1; i > 0; i--) { // 后半部分不能有前导零 if (s.charAt(i) == '0') { continue; } String left = s.substring(0, i); String right = s.substring(i); BigInteger leftNum = new BigInteger(left); BigInteger rightNum = new BigInteger(right); if (leftNum.mod(BigInteger.valueOf(a)).equals(BigInteger.ZERO) && rightNum.mod(BigInteger.valueOf(b)).equals(BigInteger.ZERO)) { return new String[]{"YES", left, right}; } } return new String[]{"NO"}; } }
- 1
信息
- ID
- 29
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者