Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2019
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.82 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. #define NMAX 100001
  5. #define lli long long int
  6. lli MOD = 1000000007;
  7. #define pb push_back
  8. #define mp make_pair
  9.  
  10. lli x,y,sz = 0;
  11.  
  12. lli fato[NMAX+100];
  13. vector<lli> primes;
  14.  
  15. void fat(){
  16. memset(fato,1,sizeof fato);
  17. lli ans = 1;
  18. for(int i = 1; i <= NMAX; i++){
  19. ans = (ans%MOD)*(i%MOD)%MOD;
  20. fato[i] = ans;
  21. }
  22. }
  23.  
  24. void gcd_extend(lli a,lli b){
  25. if(b == 0){
  26. x = 1;
  27. y = 0;
  28. }else{
  29. gcd_extend(b,a%b);
  30. lli aux = x;
  31. x = y;
  32. y = aux - (a/b) * y;
  33. }
  34. }
  35.  
  36. lli inv(lli a,lli b){
  37. gcd_extend(a,b);
  38. return (x%b+b)%b;
  39. }
  40.  
  41. lli exp(lli a,lli b,lli MOD){
  42. if(b == 0)
  43. return 1;
  44. lli ans = exp(a,b/2,MOD);
  45. ans = (ans*ans)%MOD;
  46. if(b & 1)
  47. ans = (ans*a) % MOD;
  48. return ans;
  49. }
  50.  
  51. void sieve(){
  52. bool prime[NMAX+100];
  53. memset(prime,true,sizeof prime);
  54. for(int i = 4; i <= NMAX; i+=2)
  55. prime[i] = false;
  56. for(int i = 3; i <= NMAX; i+=2)
  57. for(int j = i+i; j <= NMAX; j+=i)
  58. prime[j] = false;
  59.  
  60. primes.pb(2);
  61. sz++;
  62. for(int i = 3; i <= NMAX; i+=2)
  63. if(prime[i]){
  64. primes.pb(i);
  65. sz++;
  66. }
  67. }
  68.  
  69.  
  70. //((p^fat+1)-1)/(p-1)
  71. lli solve(int n){
  72.  
  73. map<lli, int> facs;
  74. for(int i = 2; i <= n; ++i) {
  75. int x = i;
  76. for(int p : primes) {
  77. if(x % p == 0) {
  78. int e = 0;
  79. while(x % p == 0) {
  80. x /= p;
  81. ++e;
  82. }
  83. facs[p] += e;
  84. }
  85. if (p*p > x) break;
  86. }
  87. if(x > 1) {
  88. facs[x] += 1;
  89. }
  90. }
  91.  
  92. lli ans = 1;
  93. for( const auto& x : facs ){
  94. lli term = ((exp(x.first, x.second+1,MOD) - 1) * inv(x.first - 1,MOD)) % MOD;
  95. ans = (ans*term)%MOD;
  96. }
  97. return ans;
  98. }
  99.  
  100. int main(){
  101. fat();
  102. sieve();
  103. lli i;
  104. while(cin>>i){
  105. lli r = (solve(i) - fato[i] + MOD) % MOD;
  106. cout<<r<<" "<<fato[i]<<endl;
  107. }
  108.  
  109. return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement