Pagini recente » Monitorul de evaluare | Cod sursa (job #1750354) | Cod sursa (job #2202169) | Cod sursa (job #1471768) | Cod sursa (job #1706670)
#include <stdio.h>
#include <stdlib.h>
#define MOD 9973
#define BUF_SIZE 8192
char buf[BUF_SIZE];
int poz;
FILE*fi;
inline char nextch(){
if(poz==BUF_SIZE){
fread(buf, 4096, 1, fi);
poz=0;
}
return buf[poz++];
}
inline long long multiply(long long a, long long n){
/*long long p=0LL;
while(n>0){
if(n%2==1)
p=(p+a)%MOD;
a=(a+a)%MOD;
n/=2;
}
return p;*/
return (a*n)%MOD;
}
inline long long exponentiate(long long a, long long n){
long long p=1LL;
while(n>0){
if(n%2==1)
p=multiply(p, a);
a=multiply(a, a);
n/=2;
}
return p;
}
char ciur[1000001];
long long prime[1000001], ind;
inline void prepare(){
ciur[0]=ciur[1]=1;
for(int i=2;i*i<=1000000;i++)
if(ciur[i]==0)
for(int j=i*i;j*j<=1000000;j+=i)
ciur[j]=1;
ind=0;
for(int i=2;i<=1000000;i++)
if(ciur[i]==0)
prime[ind++]=i;
}
int main(){
int n, i;
FILE*fo;
fi=fopen("ssnd.in","r");
fo=fopen("ssnd.out","w");
fscanf(fi,"%d", &n);
prepare();
poz=BUF_SIZE;
nextch();
for(i=0;i<n;i++){
long long x;
x=0LL;
char c=nextch();
while(c<'0' || '9'<c)
c=nextch();
while('0'<=c && c<='9'){
x=x*10+c-'0';
c=nextch();
}
long long div=0;
long long numdiv=1;
long long sumdiv=1;
while(prime[div]*prime[div]<=x){
if(x%prime[div]==0){
long long b=prime[div]%MOD, exp=1;
while(x%prime[div]==0){
b=multiply(b, prime[div]);
exp++;
x/=prime[div];
}
numdiv=multiply(numdiv, exp);
sumdiv=multiply(multiply(sumdiv, b-1), exponentiate(prime[div]-1, MOD-2));
}
div++;
}
if(x>1){
numdiv=(numdiv*2)%MOD;
sumdiv=multiply(multiply(sumdiv, exponentiate(x, 2)-1), exponentiate(x-1, MOD-2));
}
fprintf(fo,"%lld %lld\n", numdiv, sumdiv);
}
fclose(fi);
fclose(fo);
return 0;
}