Pagini recente » Cod sursa (job #272386) | Cod sursa (job #2336011) | Cod sursa (job #1287490) | Cod sursa (job #672122) | Cod sursa (job #863010)
Cod sursa(job #863010)
#include <stdio.h>
#include <math.h>
#include <bitset>
using namespace std;
FILE *f=fopen("ssnd.in","r");
FILE *g=fopen("ssnd.out","w");
bitset <1000010> v;
int t,nr,p,m,b[80001],nr1,maxim,i,j,mod=9973,s;
long long div,l,maxi,a[1001];
void ciur()
{
int i,j;
v[2]=0;//2 este singurul nr prim par
nr1=1;
b[nr1]=2;
for(i=3;i<=maxim;i+=2)//i-ul incepe cu val 3 si creste cu 2 ca sa ignor celelalte nr pare
if (v[i]==0)//daca e prim
{
nr1++;
b[nr1]=i;
for(j=3;i*j<=maxim;j+=2)
v[i*j]=1;//bifesez multiplii
}
}
int main()
{
fscanf(f,"%d",&t);
for(i=1;i<=t;i++){
fscanf(f,"%lld",&a[i]);
if (a[i]>maxi)maxi=a[i];
}
maxim=trunc(sqrt(maxi));
ciur();
for(i=1;i<=t;i++)
{
nr=1;//nr de divizori
s=1; //suma
l=a[i];//copie
j=1;
while((long long)b[j]*b[j]<=a[i] && j<=nr1 && l!=1)
{
if (l%b[j]==0)
{
p=0;//puterea la care se gaseste divizorul in numar
div=1;
while(l%b[j]==0){
p++;//creste puterea
l=l/b[j];
div=div*b[j];
}
div=div*b[j]-1;
s=(s*(div/(b[j]-1)))%mod;//sd=(div1^(p1+1))/(p1-1)...*(divn^(pn+1))/(pn-1)
nr=nr*(p+1);//nrd=(p1+1)*(p2+1)*...(pn+1)
}
j++;
}
if (l!=1){nr=nr*2;s=(s*(l*l-1)/(l-1))%mod;}
//verif cazul in care numarul are un divizor prim mai mare ca radicalul sau
fprintf(g,"%d %d\n",nr,s);
}
fclose(g);
return 0;
}