Pagini recente » Cod sursa (job #523100) | Cod sursa (job #1426194) | Cod sursa (job #252404) | Cod sursa (job #139382) | Cod sursa (job #655167)
Cod sursa(job #655167)
#include <bitset>
#include <cstdio>
using namespace std;
FILE* fout = fopen("ssnd.out","w");
#define MAXP 1000005
#define MOD 9973
typedef long long int64;
//<parsing>
FILE* fin = fopen("ssnd.in","r");
const unsigned maxb = 8192;
char buf[maxb];
unsigned ptr = 0;
inline int64 getInt()
{
int64 nr = 0;
while (buf[ptr] < '0' || '9' < buf[ptr]) {
if (++ptr >= maxb) {
fread (buf, maxb, 1, fin), ptr = 0;
}
}
while('0' <= buf[ptr] && buf[ptr] <= '9') {
nr = nr * 10 + buf[ptr] - '0';
if (++ptr >= maxb) {
fread(buf, maxb, 1, fin), ptr = 0;
}
}
return nr;
}
//</parsing>
int prim[80000],np = 0;
bitset<MAXP> era;
inline int pow(int a, int p){
int x = a, r = 1;
while (p) {
if (p & 1) {
r = (r * x) % MOD;
}
x = (x * x) % MOD, p >>= 1;
}
return r;
}
void ciur()
{
for (int i = 1; ((i * i) << 1) + (i << 1) < MAXP; ++i){
if(!era[i]){
for(int j = ((i * i) << 1) + (i << 1);(j << 1) + 1 < MAXP; j += (i << 1) + 1){
era[j] = true;
}
}
}
prim[np++] = 2;
for(int i = 1;(i << 1) + 1< MAXP;i++){
if(!era[i]){
prim[np++]=(i << 1) + 1;
}
}
}
void doTest(int64 nr)
{
int64 nd = 1LL, sd = 1LL;
for (int i = 0; i < np && (int64)prim[i] * prim[i] <= nr; ++i) {
if (!(nr % prim[i])) {
int p = 0, sp = prim[i];
while (!(nr % prim[i])) {
nr /= prim[i], sp *= prim[i];
++p;
}
nd = (nd * (p + 1))%MOD;
sd =(((sd*((sp - 1) % MOD))%MOD)*(pow(prim[i]-1, MOD-2)))%MOD;
}
}
if (nr > 1) {
nd = (nd << 1) % MOD;
sd = (((sd * ((nr * nr - 1) % MOD)) % MOD)*(pow(nr - 1, MOD-2)))%MOD;
}
fprintf(fout,"%lld %lld\n", nd, sd);
}
int main(){
ciur();
for(int i = 0, t = getInt();i < t; i++){
doTest(getInt());
}
fclose(fin);
fclose(fout);
return 0;
}