Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define NMAX 100001
- #define lli long long int
- lli MOD = 1000000007;
- #define pb push_back
- #define mp make_pair
- lli x,y,sz = 0;
- lli fato[NMAX+100];
- vector<lli> primes;
- void fat(){
- memset(fato,1,sizeof fato);
- lli ans = 1;
- for(int i = 1; i <= NMAX; i++){
- ans = (ans%MOD)*(i%MOD)%MOD;
- fato[i] = ans;
- }
- }
- void gcd_extend(lli a,lli b){
- if(b == 0){
- x = 1;
- y = 0;
- }else{
- gcd_extend(b,a%b);
- lli aux = x;
- x = y;
- y = aux - (a/b) * y;
- }
- }
- lli inv(lli a,lli b){
- gcd_extend(a,b);
- return (x%b+b)%b;
- }
- lli exp(lli a,lli b,lli MOD){
- if(b == 0)
- return 1;
- lli ans = exp(a,b/2,MOD);
- ans = (ans*ans)%MOD;
- if(b & 1)
- ans = (ans*a) % MOD;
- return ans;
- }
- void sieve(){
- bool prime[NMAX+100];
- memset(prime,true,sizeof prime);
- for(int i = 4; i <= NMAX; i+=2)
- prime[i] = false;
- for(int i = 3; i <= NMAX; i+=2)
- for(int j = i+i; j <= NMAX; j+=i)
- prime[j] = false;
- primes.pb(2);
- sz++;
- for(int i = 3; i <= NMAX; i+=2)
- if(prime[i]){
- primes.pb(i);
- sz++;
- }
- }
- //((p^fat+1)-1)/(p-1)
- lli solve(int n){
- map<lli, int> facs;
- for(int i = 2; i <= n; ++i) {
- int x = i;
- for(int p : primes) {
- if(x % p == 0) {
- int e = 0;
- while(x % p == 0) {
- x /= p;
- ++e;
- }
- facs[p] += e;
- }
- if (p*p > x) break;
- }
- if(x > 1) {
- facs[x] += 1;
- }
- }
- lli ans = 1;
- for( const auto& x : facs ){
- lli term = ((exp(x.first, x.second+1,MOD) - 1) * inv(x.first - 1,MOD)) % MOD;
- ans = (ans*term)%MOD;
- }
- return ans;
- }
- int main(){
- fat();
- sieve();
- lli i;
- while(cin>>i){
- lli r = (solve(i) - fato[i] + MOD) % MOD;
- cout<<r<<" "<<fato[i]<<endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement