Advertisement
Guest User

Untitled

a guest
Feb 14th, 2016
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.11 KB | None | 0 0
  1. #include <cstdio>
  2. #include <vector>
  3. #include <map>
  4. #include <math.h>
  5. #include <cstring>
  6.  
  7. using namespace std;
  8.  
  9. #define MOD 1000000007
  10. #define MAX 100001
  11. #define SQRT_MAX 317
  12.  
  13. void get_primes();
  14. void div(int n);
  15. int mul_inv(int a, int b);
  16.  
  17. vector<int> primes;
  18. vector<int>::iterator it;
  19. int sieve[MAX];
  20. int factorial[MAX];
  21. map<int, int> mymap[MAX], aux;
  22. map<int, int>::iterator mit;
  23.  
  24. int main()
  25. {
  26.     get_primes();
  27.    
  28.     factorial[1] = 1;
  29.     for(int i = 2; i < MAX; i++){
  30.         factorial[i] = (i*factorial[i-1])%MOD;
  31.         div(i);
  32.     }
  33.  
  34.     int N = MAX-1;
  35.     while(scanf("%d", &N) != EOF)
  36.     {
  37.         aux.clear();
  38.         for(int i = 2; i <= N; i++){
  39.             for(mit = mymap[i].begin(); mit != mymap[i].end(); mit++){
  40.                 aux[mit->first]+=mit->second;
  41.             }
  42.         }
  43.  
  44.         int num = 1, num_act;
  45.         int denom = 1;
  46.         for(mit = aux.begin(); mit != aux.end(); mit++) {
  47.             num_act = 1;
  48.             for(int i = 0; i < mit->second+1; i++)
  49.                 num_act = (num_act*mit->first)%MOD;
  50. /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
  51.             num_act = (num_act-1)%MOD;
  52.             num = (num*num_act)%MOD;
  53.             denom = (denom * (mit->first-1)%MOD)%MOD;
  54.         }
  55.  
  56.         int final = (num/denom)%MOD; //se eu multiplico pelo inverso multiplicativo da um resultado louco
  57.         printf("%d %d\n",(final%MOD - factorial[N]%MOD)%MOD, factorial[N]);
  58. /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
  59.     }
  60.  
  61.  
  62. }
  63.  
  64. void div(int n)
  65. {
  66.     it = primes.begin();
  67.     int n_cpy = n;
  68.  
  69.     while(n_cpy != 1) {
  70.         while(n_cpy%(*it) == 0) {
  71.             mymap[n][*it]++;
  72.             n_cpy/=(*it);
  73.         }
  74.         if(it == primes.end()){
  75.             if(n_cpy != 0)
  76.                 mymap[n][n_cpy]++;
  77.             break;
  78.         }
  79.         it++;
  80.     }      
  81. }
  82.  
  83.  
  84. void get_primes()
  85. {
  86.     memset(sieve, 0, sizeof sieve);
  87.    
  88.     sieve[0] = sieve[1] = 1;
  89.  
  90.     for(int i = 2; i < MAX; i++)
  91.         if(!sieve[i]){
  92.             primes.push_back(i);
  93.             for(int j = i+i; j < MAX; j+=i)
  94.                 sieve[j] = 1;
  95.         }
  96. }
  97.  
  98. int mul_inv(int a, int b) //x1*a = 1(mod(b))
  99. {
  100.     int b0 = b, t, q;
  101.     int x0 = 0, x1 = 1;
  102.     if (b == 1) return 1;
  103.     while (a > 1) {
  104.         q = a / b;
  105.         t = b; b = a % b; a = t;
  106.         t = x0; x0 = x1 - q * x0; x1 = t;
  107.     }
  108.     if (x1 < 0) x1 += b0;
  109.     return x1;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement