Cod sursa(job #2406118)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 15 aprilie 2019 13:21:32
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include<cstdio>
const int N=1000001,M=9973,R=20000000;
long long n,t;
int k,p[80000],i,j,w,z,r,x,y,q,o;
bool v[N];
char u[R],e[R];
inline long long A()
{
  	long long s=0;
  	for(;u[q]<48||u[q]>57;q++);
  	for(;u[q]>=48&&u[q]<=57;q++)
  		s=s*10+u[q]-48;
  	return s;
}
inline void S(long long x,char c)
{
    int i,f[30];
    if(!x)
        e[o++]=48;
    for(j=0;x;x/=10)
        f[j++]=x%10;
    for(i=j-1;i>=0;i--)
        e[o+i]=f[j-1-i]+48;
    e[o+j]=c,o+=j+1;
}
inline int P(int x,int p)
{
	int r=1;
	for(x%=M;p;p>>=1,x=(x*x)%M)
		if(p&1)
			r=(x*r)%M;
	return r;
}
int main()
{
	freopen("ssnd.in","r",stdin),freopen("ssnd.out","w",stdout),fread(u,1,R,stdin);
	for(i=2;i<N;i++)
		if(!v[i])
			for(j=2*i;j<N;j+=i)
				v[j]=1;
    for(i=2;i<N;i++)
        if(!v[i])
            p[++k]=i;
	for(t=A();t;t--)
    {
        for(n=A(),w=z=i=1;i<=k&&1LL*p[i]*p[i]<=n;i++)
        {
            if(n%p[i])
                continue;
            for(r=0;n%p[i]==0;n/=p[i],r++);
            w*=(r+1),x=(P(p[i],r+1)-1)%M,y=P(p[i]-1,M-2)%M,z=(((z*x)%M)*y)%M;
        }
        if(n>1)
            w*=2,z=(1LL*z*(n+1)%M);
        S(w,' '),S(z,'\n');
    }
    fwrite(e,1,o,stdout);
}