niyaznigmatullin

Untitled

Nov 2nd, 2014
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.98 KB | None | 0 0
  1. #include <cstdio>
  2.  
  3. int const MOD = 1000000007;
  4.  
  5.  
  6. int modpow(int a, int b) {
  7.   int ret = 1;
  8.   while (b > 0) {
  9.     if (b & 1) ret = (long long) ret * a % MOD;
  10.     a = (long long) a * a % MOD;
  11.     b >>= 1;
  12.   }
  13.   return ret;
  14. }
  15.  
  16. int s[7][1 << 21];
  17. int ans[1 << 21];
  18.  
  19. void fft(int * a, int l, int r) {
  20.   if (l + 1 == r) return;
  21.   int half = (r - l) >> 1;
  22.   int mid = l + half;
  23.   fft(a, l, mid);
  24.   fft(a, mid, r);
  25.   for (int i = l; i < mid; i++) {
  26.     int x1 = a[i];
  27.     int x2 = a[i + half];
  28.     a[i] = x1 - x2;
  29.     if (a[i] < 0) a[i] += MOD;
  30.     a[i + half] = x1 + x2;
  31.     if (a[i + half] >= MOD) a[i + half] -= MOD;
  32.   }
  33. }
  34.  
  35. void fftrev(int * a, int l, int r) {
  36.   if (l + 1 == r) return;
  37.   int half = (r - l) >> 1;
  38.   int mid = l + half;
  39.   fftrev(a, l, mid);
  40.   fftrev(a, mid, r);
  41.   for (int i = l; i < mid; i++) {
  42.     int x1 = a[i];
  43.     int x2 = a[i + half];
  44.     a[i] = x1 + x2;
  45.     if (a[i] >= MOD) a[i] -= MOD;
  46.     a[i + half] = x1 - x2;
  47.     if (a[i + half] < 0) a[i + half] += MOD;
  48.   }
  49. }
  50.  
  51. int main() {
  52.   int n, m, k;
  53.   scanf("%d%d%d", &n, &m, &k);
  54.   for (int i = 0; i < m; i++) {
  55.     int c = getchar();
  56.     while (c <= 32) c = getchar();
  57.     int f = 0;
  58.     while (c > 32) {
  59.       s[i][f++] = c == '1';
  60.       c = getchar();
  61.     }
  62.     fft(s[i], 0, 1 << n);
  63.   }
  64.   for (int q = 0; q < k; q++) {
  65.     int v, u;
  66.     scanf("%d%d", &v, &u);
  67.     int * f1 = s[v];
  68.     int * f2 = s[u];
  69.     for (int i = 0; i < 1 << n; i++) ans[i] = (long long) f1[i] * f2[i] % MOD;
  70.     fftrev(ans, 0, 1 << n);
  71.     int invn = modpow(1 << n, MOD - 2);
  72.     for (int i = 0; i < 1 << n; i++) {
  73.       ans[i] = (long long) ans[i] * invn % MOD;
  74.       ans[i] = ans[i] > 0 ? 1 : 0;
  75.     }
  76.     for (int mask = (1 << n) - 1; mask >= 0; mask--) {
  77.       for (int i = 0; !ans[mask] && i < n; i++) {
  78.         if (((mask >> i) & 1) == 1) continue;
  79.         ans[mask] |= ans[mask | (1 << i)];
  80.       }
  81.     }
  82.     for (int i = 0; i < 1 << n; i++) putchar('0' + (int) ans[i]);
  83.     puts("");
  84.   }
  85. }
Advertisement
Add Comment
Please, Sign In to add comment