Pagini recente » Cod sursa (job #960232) | Cod sursa (job #1845966) | Cod sursa (job #712367) | Cod sursa (job #2172664) | Cod sursa (job #3302391)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("ssnd.in");
ofstream fout ("ssnd.out");
using int64 = long long;
const int MOD = 9973;
int64 modexp(int64 a, int64 e, int mod=MOD){
int64 r = 1 % mod;
a %= mod;
while(e){
if(e & 1) r = r * a % mod;
a = a * a % mod;
e >>= 1;
}
return r;
}
int64 inv(int64 x){ // inverse modulo MOD (MOD e prim)
return modexp(x, MOD - 2);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
// 1) generare primalitate până la 1e6
const int MAXP = 1000000;
vector<bool> sieve(MAXP+1, true);
sieve[0] = sieve[1] = false;
vector<int> primes;
for(int i = 2; i <= MAXP; ++i) if(sieve[i]){
primes.push_back(i);
if((int64)i * i <= MAXP)
for(int j = i * i; j <= MAXP; j += i)
sieve[j] = false;
}
int T;
fin >> T;
while(T--){
int64 n;
fin >> n;
int64 original = n;
int64 numDiv = 1;
int64 sumDivMod = 1; // ținem suma mod 9973
for(int p : primes){
if((int64)p * p > n) break;
if(n % p == 0){
int cnt = 0;
while(n % p == 0){
n /= p;
cnt++;
}
numDiv *= (cnt + 1);
// sumă = (p^(cnt+1) - 1) / (p - 1) mod MOD
int64 term = (modexp(p, cnt + 1) - 1 + MOD) % MOD;
term = term * inv(p - 1 + MOD) % MOD;
sumDivMod = sumDivMod * term % MOD;
}
}
if(n > 1){
// rămâne un prim mare
numDiv *= 2;
int64 term = (modexp(n % MOD, 2) - 1 + MOD) % MOD;
term = term * inv((n % MOD - 1 + MOD) % MOD) % MOD;
sumDivMod = sumDivMod * term % MOD;
}
fout << numDiv << " " << sumDivMod << "\n";
}
return 0;
}