Cod sursa(job #872187)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 5 februarie 2013 21:12:22
Problema Principiul includerii si excluderii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <stdio.h>
#include <math.h>
#define ll long long
#define MAX_P 1000000
using namespace std;
ll m,a,b,fact[30];
int np[80000],nrp;
bool ciur[MAX_P];
void prec(){
    int i,j;
    for(i=2;i<MAX_P;i++)
        if(!ciur[i]){
            for(j=2*i;j<MAX_P;j+=i)
                ciur[j]=1;
            np[++nrp]=i;
        }
}
void solve(){
    ll t=0,d=0,i,j,nr,p,sol=a;
    while(b>1){
        d++;
        if(b%np[d]==0){
            fact[++t]=np[d];
            while(b%np[d]==0)
                b/=np[d];
        }
        if((np[d]+1)*(np[d]+1)>b && b>1){
            fact[++t]=b;
            b=1;
        }
    }
    for(i=1;i<(1<<t);i++){
        nr=0,p=1;
        for(j=0;j<t;j++)
            if((1<<j)&i){
                p=p*fact[j+1];
                nr++;
            }
        if(nr%2)
            nr=-1;
        else
            nr=1;
        sol=sol+nr*a/p;
    }
    printf("%lld\n", sol);
}
int main(){
    int i;
    freopen("pinex.in","r",stdin);
    freopen("pinex.out","w",stdout);
    prec();
    scanf("%lld",&m);
    for(i=1;i<=m;i++){
        scanf("%lld %lld",&a,&b);
        solve();
    }
    return 0;
}