Pagini recente » Cod sursa (job #2747202) | Cod sursa (job #2712655) | Cod sursa (job #526459) | Cod sursa (job #3179047) | Cod sursa (job #2498278)
#include <fstream>
#include <bitset>
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
int t, a, b, c, nrdiv, sum, prime[100003], i, j, nrP;
long long n, m;
bitset<1000001> f;
void ridicare(int baza, int putere, int &rezultat){
if(putere == 0)
return;
int r1 = 1;
rezultat = 1;
ridicare(baza, putere/2, r1);
rezultat = (r1*r1)%9973;
if(putere % 2 == 1)
rezultat = rezultat*baza%9973;
}
int main(){
f[0] = f[1] = 1;
for(i=2;i<=1000000;i++)
if(f[i] == 0){
prime[++nrP] = i;
for(j=i+i;j<=1000000;j+=i)
f[j] = 1;
}
fin>>t;
while(t--){
fin>>n;
m = n;
nrdiv = 1, sum = 1;
for(i=1;prime[i]*prime[i]<=n && i<=nrP && m>1;++i){
if(m%prime[i] == 0){
a = 0, b = 0, c = 0;
while(m%prime[i] == 0 && m>1){
a++;
m /= prime[i];
}
nrdiv *= 1+a;
ridicare(prime[i], a+1, b);
b--;
if(b<0)
b+=9973;
ridicare(prime[i]-1, 9971, c);
sum = (((b%9973)*(c%9973)%9973)*sum)%9973;
}
}
if(m > 1){
a = 1, b = 0, c = 0;;
nrdiv *= 1+a;
ridicare(m, a+1, b);
b--;
if(b<0)
b+=9973;
ridicare(m-1, 9971, c);
sum = (((b%9973)*(c%9973)%9973)*sum)%9973;
}
fout<<nrdiv<<" "<<sum<<"\n";
}
return 0;
}