Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <vector>
- #include <map>
- #include <math.h>
- #include <cstring>
- using namespace std;
- #define MOD 1000000007
- #define MAX 100001
- #define SQRT_MAX 317
- void get_primes();
- void div(int n);
- int mul_inv(int a, int b);
- vector<int> primes;
- vector<int>::iterator it;
- int sieve[MAX];
- int factorial[MAX];
- map<int, int> mymap[MAX], aux;
- map<int, int>::iterator mit;
- int main()
- {
- get_primes();
- factorial[1] = 1;
- for(int i = 2; i < MAX; i++){
- factorial[i] = (i*factorial[i-1])%MOD;
- div(i);
- }
- int N = MAX-1;
- while(scanf("%d", &N) != EOF)
- {
- aux.clear();
- for(int i = 2; i <= N; i++){
- for(mit = mymap[i].begin(); mit != mymap[i].end(); mit++){
- aux[mit->first]+=mit->second;
- }
- }
- int num = 1, num_act;
- int denom = 1;
- for(mit = aux.begin(); mit != aux.end(); mit++) {
- num_act = 1;
- for(int i = 0; i < mit->second+1; i++)
- num_act = (num_act*mit->first)%MOD;
- /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
- num_act = (num_act-1)%MOD;
- num = (num*num_act)%MOD;
- denom = (denom * (mit->first-1)%MOD)%MOD;
- }
- int final = (num/denom)%MOD; //se eu multiplico pelo inverso multiplicativo da um resultado louco
- printf("%d %d\n",(final%MOD - factorial[N]%MOD)%MOD, factorial[N]);
- /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
- }
- }
- void div(int n)
- {
- it = primes.begin();
- int n_cpy = n;
- while(n_cpy != 1) {
- while(n_cpy%(*it) == 0) {
- mymap[n][*it]++;
- n_cpy/=(*it);
- }
- if(it == primes.end()){
- if(n_cpy != 0)
- mymap[n][n_cpy]++;
- break;
- }
- it++;
- }
- }
- void get_primes()
- {
- memset(sieve, 0, sizeof sieve);
- sieve[0] = sieve[1] = 1;
- for(int i = 2; i < MAX; i++)
- if(!sieve[i]){
- primes.push_back(i);
- for(int j = i+i; j < MAX; j+=i)
- sieve[j] = 1;
- }
- }
- int mul_inv(int a, int b) //x1*a = 1(mod(b))
- {
- int b0 = b, t, q;
- int x0 = 0, x1 = 1;
- if (b == 1) return 1;
- while (a > 1) {
- q = a / b;
- t = b; b = a % b; a = t;
- t = x0; x0 = x1 - q * x0; x1 = t;
- }
- if (x1 < 0) x1 += b0;
- return x1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement