Advertisement
Guest User

Untitled

a guest
Sep 26th, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.95 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. typedef long double LD;
  5. typedef vector<int> VI;
  6. typedef pair<LL,LL> PLL;
  7. typedef pair<int,int> PII;
  8. typedef pair<PII,PII> PPII;
  9. #define B_E(x) x.begin(),x.end()
  10. #define PB push_back
  11. #define MP make_pair
  12. #define S second
  13. #define F first
  14. inline void file()
  15. {
  16. #ifdef _WIN32
  17.     return;
  18. #endif
  19.  
  20.     ios_base::sync_with_stdio(false);
  21.     cin.tie(NULL);
  22.     cout.tie(NULL);
  23.  
  24.     if (0) {
  25.         freopen(".in",  "r", stdin);
  26.         freopen(".out", "w", stdout);
  27.     }
  28. }
  29.  
  30. const clock_t MAXT = (100*CLOCKS_PER_SEC)/1000;
  31. const int   PX[8] = {0,1,0,-1,1,1,-1,-1},
  32.             PY[8] = {1,0,-1,0,1,-1,-1,1},
  33.             N = 1e5 + 10,
  34.             INF = 1e9,
  35.             MOD = 1e9+7;
  36. const LL    INFL = 1e18,
  37.             MODL = 1e9 + 7;
  38. const LD    EPS = 1e-6;
  39.  
  40.  
  41. LL cnt[70];
  42. LL dp[70][120000];
  43. int k,st[10];
  44.  
  45. /**
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57. */
  58.  
  59.  
  60.  
  61.  
  62. inline void factorization(LL n) {
  63.     vector<int> d;
  64.     for (int i=2; i*i <= n; ++i)
  65.         if ( !(n%i) ) {
  66.             d.PB(0);
  67.             while ( !(n%i) ) {
  68.                 n /= i;
  69.                 d.back()++;
  70.             }
  71.         }
  72.  
  73.     if ( n > 1 )
  74.         d.PB(1);
  75.  
  76.     k = d.size();
  77.     int mask = 1<<k;
  78.     for (int i=0; i<mask; ++i) {
  79.         LL sum = 1;
  80.         for (int j=0; j<k; ++j)
  81.             if ( i&(1<<j) )
  82.                 sum *= d[j]-1;
  83.  
  84.         cnt[i] = sum;
  85.     }
  86.  
  87.     d.clear();
  88.  
  89. }
  90.  
  91. inline void push_dp(int mask, int posd, int d)
  92. {
  93.  
  94.     char usd[8];
  95.     memset(usd, 0, 8);
  96.  
  97.     for (int i=0; i<k; ++i)
  98.         if ( d&(1<<i) )
  99.             usd[ (posd/st[i])%7 ]++;
  100.  
  101.     int cnt = 0;
  102.     for (int i=1; i<8; ++i)
  103.         if ( usd[i] )
  104.             ++cnt;
  105.  
  106.     if ( cnt >= 2 )
  107.         return;
  108.  
  109.     int new_mask,new_posd;
  110.     new_mask = mask;
  111.     new_posd = posd;
  112.  
  113.     for (int i=0; i<k; ++i)
  114.         if ( (d&(1<<i)) ) {
  115.             int s = (posd/st[i])%7;
  116.  
  117.             if ( s ) {
  118.                 usd[s]--;
  119.                 new_posd -= s*st[i];
  120.                 new_mask |= 1<<i;
  121.             } else {
  122.                 for (int j=1; j<k; ++j)
  123.                     if ( !usd[j] ) {
  124.                         new_posd += st[i] * j;
  125.                         ++usd[j];
  126.                         break;
  127.                     }
  128.             }
  129.  
  130.         }
  131.  
  132.     dp[new_mask][new_posd] += dp[mask][posd] * ::cnt[d];
  133.     dp[new_mask][new_posd] %= MODL;
  134.  
  135. }
  136.  
  137.  
  138. inline int solve()
  139. {
  140.  
  141.     st[0] = 1;
  142.     for (int i=1; i<=k; ++i)
  143.         st[i] = st[i-1] * 7;
  144.  
  145.     int max_mask,max_st7;
  146.     max_st7 = st[k];
  147.     max_mask = 1<<k;
  148.     dp[0][0] = 1;
  149.  
  150.     for (int m=0; m<max_mask; ++m)
  151.     for (int i=0; i<max_st7; ++i)
  152.         if ( dp[m][i] )
  153.             for (int j=0; j<max_mask; ++j)
  154.                 if ( !(j&m) )
  155.                     push_dp(m,i,j);
  156.  
  157.     for (int m=0; m<max_mask; ++m)
  158.     for (int i=0; i<max_st7; ++i)
  159.         if ( dp[m][i] )
  160.         cout<<setw(3)<<m<<' '<<i<<' '<<dp[m][i]<<'\n';
  161.  
  162.     return 0;
  163. }
  164.  
  165.  
  166. int main()
  167. { file();
  168.  
  169.     LL n;
  170.     cin>>n;
  171.     factorization(n);
  172.  
  173.     cout<<solve()<<'\n';
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement