Cod sursa(job #2430813)

Utilizator MortemPlaiasu Iulia-Silvia Mortem Data 16 iunie 2019 16:41:28
Problema Suma si numarul divizorilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <fstream>
#include <vector>
#define mod 9973
std::ifstream fin("ssnd.in");
std::ofstream fout("ssnd.out");

int t, n;
bool isNP[1005000];
std::vector<long long> v;

void euclid(int a, int b,int &x, int &y)
{
  if(b==0)
  {
    x=1;
    y=0;
  }
  else
  {
    int x0, y0;
    euclid(b,a%b,x0,y0);
    x= y0;
    y= x0- (a/b)*y0;
  }
}

int main()
{
  for(int i=4;i<1005000;i+=2)
    isNP[i]=true;
  for(int i=3;i*i<1005000;i+=2)
    for(int p=i*i;p<1005000;p+=i)
      isNP[p]=true;
  v.push_back(2);
  for(int i=3;i<1005000;i+=2)
    if(!isNP[i])
      v.push_back(i);
  fin>>t;
  for(int i=0;i<t;i++)
  {
    fin>>n;
    long long sum=1;
    long long countt=1;
    for(unsigned int j=0;j<v.size();j++)
    {
      int c=0;
      int powj=v[j]%mod;
      while(n%v[j]==0)
      {
        c++;
        n=n/v[j];
        powj=(powj*v[j])%mod;
      }
      if(c!=0)
      {
        countt=(countt*(c+1))%mod;
        int x, y;
        euclid(v[j]-1,mod,x,y);
        if(x<0)
          x+=(-x/mod+1)*mod;
        x=x%mod;
        sum= (sum* ((powj-1)*x)%mod)%mod;
      }
      if(n==1) break;
    }
    fout<< countt<<" "<<sum<<"\n";
  }
}