Mai intai trebuie sa te autentifici.
Cod sursa(job #1700838)
Utilizator | Data | 11 mai 2016 14:43:18 | |
---|---|---|---|
Problema | Suma si numarul divizorilor | Scor | 10 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.21 kb |
#include <cstdio>
#define MAXN 1000000
#define MOD 9973
using namespace std;
char ciur[MAXN+1], prime[MAXN];
inline int mypow(int baza, int exp){
int rez=1;
while(exp){
if(exp&1){
rez=(baza*rez)%MOD;
}
baza=(baza*baza)%MOD;
exp>>=1;
}
return rez;
}
int main()
{
FILE *fin, *fout;
int n, nrp, i, t, d, expo, nrd, smd;
int x1, x2;
nrp=0;
for(i=2; i*i<=MAXN; i++)
if(ciur[i]==0){
prime[nrp++]=i;
for(d=i*i; d<=MAXN; d+=i)
ciur[d]=1;
}
fin=fopen("ssnd.in", "r");
fscanf(fin, "%d", &t);
fout=fopen("ssnd.out", "w");
for(i=0; i<t; i++){
fscanf(fin, "%d", &n);
d=0;
nrd=smd=1;
while(d<nrp && 1LL*prime[d]*prime[d]<=n){
expo=0;
while(n%prime[d]==0){
++expo;
n/=prime[d];
}
nrd*=(expo+1);
x1=(mypow(prime[d], expo+1)-1+MOD)%MOD;
x2=mypow(prime[d]-1, MOD-2);
smd=(((smd*x1)%MOD)*x2)%MOD;
++d;
}
if(n>1){
nrd*=2;
smd=(smd*(n+1))%MOD;
}
fprintf(fout, "%d %d\n", nrd, smd);
}
fclose(fin);
fclose(fout);
return 0;
}