Cod sursa(job #1289020)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 9 decembrie 2014 13:00:46
Problema Principiul includerii si excluderii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.33 kb
#include <stdio.h>
#include <cmath>
int div[100000],pos;
bool schimb[100000],ciur[300006];
int a,b,temp,tx=0;
FILE *fin,*fout;
void ver()
{
    int ct=0;
    int mult=1;
    for(int i=1;i<pos;i++)
    {
            if(schimb[i]==1)
            {
                            ct++;
                            mult*=div[i];
            }
    }
    if(ct==0) return ;
    if(ct%2==0) tx-=a/mult;
    else if(ct%2!=0) tx+=a/mult;
}
void bcs(int pt)
{
     if(pt==pos) ver();
     else
     {
         for(int i=0;i<=1;i++)
         {
                 schimb[pt]=i;
                 bcs(pt+1);
         }
     }
}
int main()
{
    for(int i=2;i<=300005;i++)
    {
            if(ciur[i]==0) 
            {
                           for(int j=i;j<300005/i;j++) 
                           {
                                   ciur[i*j]=1;
                           }
            }
    }
    fin=fopen("pinex.in","r");
    fout=fopen("pinex.out","w");
    int n;
    fscanf(fin,"%d",&n);
    for(int i=1;i<=n;i++)
    {
            pos=1;
            fscanf(fin,"%d %d",&a,&b);
            if(b==1)
            {
                    fprintf(fout,"%d\n",a);
            } 
            else
            {
                    if(ciur[b]==0)
                    {
                          div[pos]=b;
                          pos++;
                    }
                    else
                    {
                              for(int i=2;;i++)
                              {
                                      if(ciur[i]==0)
                                      {
                                                    if(b%i==0)
                                                    {
                                                              div[pos]=i;
                                                              pos++;
                                                              while(b%i==0) b/=i;
                                                              if(b==1) break;
                                                              }
                                      }
                              }
                    }
            tx=0;
            for(int i=1;i<pos;i++) schimb[i]=0;
            bcs(1);
            fprintf(fout,"%d\n",a-tx);
            }
    }
}