Advertisement
Guest User

PE511

a guest
Jun 26th, 2015
437
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.84 KB | None | 0 0
  1. import java.util.*;
  2.  
  3. public class P511
  4. {
  5.     static final int mod = 1_000_000_000;
  6.     static final int k = 4321, kpow = 8192;
  7.     static final int[] cnt = new int[k];
  8.     static final int[][] dp = new int[128][];
  9.  
  10.     static int[] rek(final long n, final int log)
  11.     {
  12.         if(dp[log]!=null) return dp[log];
  13.         if(n==1) return dp[log] = cnt;
  14.  
  15.         final int[] a = n%2!=0 ? cnt : rek(n/2,log+1),
  16.         b = n%2!=0 ? rek(n-1,log+1) : rek(n/2,log+1);
  17.  
  18.         final int[] v = new int[2*kpow], u = new int[2*kpow];
  19.         System.arraycopy(a,0,v,0,k);
  20.         System.arraycopy(b,0,u,0,k); System.arraycopy(b,0,u,k,k);
  21.         final int[] w = karatsuba(v, u, 0, 2*kpow);
  22.  
  23.         return dp[log] = Arrays.copyOfRange(w, k, 2*k);
  24.     }
  25.     static int[] karatsuba(final int[] v, final int[] u, final int off, final int len)
  26.     {
  27.         if(len<=32)
  28.         {
  29.             final int[] w = new int[2*len-1];
  30.             for(int i = 0; i<len; i++)
  31.             {
  32.                 final long mul = v[off+i];
  33.                 if(mul!=0)
  34.                     for(int j = 0; j<len; j++)
  35.                         w[i+j] = (int)((w[i+j] + mul*u[off+j])%mod);
  36.             }
  37.             return w;
  38.         }
  39.  
  40.         final int[] w1 = karatsuba(v, u, off+len/2, len/2), w2 = karatsuba(v, u, off, len/2);
  41.         final int[] v2 = new int[len/2], u2 = new int[len/2];
  42.         for(int i = 0; i<len/2; i++) v2[i] = (v[off+i] + v[off+i+len/2])%mod;
  43.         for(int i = 0; i<len/2; i++) u2[i] = (u[off+i] + u[off+i+len/2])%mod;
  44.         final int[] w3 = karatsuba(v2, u2, 0, len/2), w = new int[2*len-1];
  45.  
  46.         System.arraycopy(w2,0,w,0,len-1);
  47.         System.arraycopy(w1,0,w,len,len-1);
  48.         for(int i = 0; i<len-1; i++)
  49.             w[i+len/2] = (int)(((long)w[i+len/2]+w3[i]-w2[i]-w1[i]+2*mod)%mod);
  50.         return w;
  51.     }
  52.  
  53.     public static void main(String[] klein)
  54.     {
  55.         final long n = 1234567898765L;
  56.         for(long div = 1; div*div<=n; div++)
  57.             if(n%div==0)
  58.             {
  59.                 cnt[(int)(div%k)]++;
  60.                 if(div*div!=n) cnt[(int)(n/div%k)]++;
  61.             }
  62.         System.out.println("Svar: " + rek(n,0)[(int)((k-n%k)%k)]);
  63.     }
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement