Tarango

Divisibility

Sep 4th, 2015
234
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.52 KB | None | 0 0
  1. //Check if a number is divisible from left and right iteration:
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. string s, t1, t2;
  6. int a, b, N;
  7.  
  8. long long prefix_mod[1000005];
  9. long long suffix_mod[1000005];
  10.  
  11. long long big_mod(long long N, long long P, long long Mod) {
  12.     if (P == 0) {
  13.         return 1;
  14.     }
  15.     if (P % 2 == 0) {
  16.         long long ret = big_mod(N, P / 2, Mod);
  17.         return ((ret % Mod) * (ret % Mod)) % Mod;
  18.     } else {
  19.         return ((N % Mod) * (big_mod(N, P - 1, Mod) % Mod)) % Mod;
  20.     }
  21. }
  22.  
  23. void calc_prefix_mod(string s, long long divisor) {
  24.     long long mod = 0, val = 0;
  25.     int N = s.length();
  26.     for (int i = 0; i < N; i++) {
  27.         val = (long long) (s[i] - '0');
  28.         mod = (mod * 10 + val) % divisor;
  29.         prefix_mod[i] = mod;
  30.     }
  31. }
  32.  
  33. void calc_suffix_mod(string s, long long divisor) {
  34.     long long mod = 0, val = 0, power = 1;
  35.     int N = s.length();
  36.     int prev_digit = 0;
  37.     for (int i = N - 1; i >= 0; i--) {
  38.         val = (long long) (s[i] - '0');
  39.         mod = ((val * power) % divisor + mod) % divisor;
  40.         suffix_mod[i] = mod;
  41.         prev_digit++;
  42.         power = (power * 10) % divisor;
  43.     }
  44. }
  45.  
  46. int main() {
  47.     cin >> s >> a >> b;
  48.     N = s.length();
  49.     calc_prefix_mod(s, a);
  50.     calc_suffix_mod(s, b);
  51.     bool res = false;
  52.     for (int i = 0; i < N - 1; i++) {
  53.         if (s[i + 1] == '0')
  54.             continue;
  55.         if (prefix_mod[i] == 0 && suffix_mod[i + 1] == 0) {
  56.             res = true;
  57.             t1 = t2 = s;
  58.             t1 = t1.substr(0, i + 1);
  59.             t2 = t2.substr(i + 1, N);
  60.             break;
  61.         }
  62.     }
  63.     if (res == true) {
  64.         cout << "YES\n" << t1 << endl << t2 << endl;
  65.     } else {
  66.         cout << "NO\n";
  67.     }
  68. }
Advertisement
Add Comment
Please, Sign In to add comment