Cod sursa(job #1700330)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 10 mai 2016 00:49:53
Problema Principiul includerii si excluderii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <cstdio>
using namespace std;

inline int cbits(int arg) {
    int ans = 0;
    while(arg) {
        if(arg&1)
            ++ans;
        arg>>=1;
    }
    return ans;
}

inline int pinex(int a, int b) {
    int f[25];
    int i, top, tmp, ans;

    ans = a;
    top = 0;
    i   = 1;

    if(!(b%2)){
        while(!(b%2))
            b/=2;
        f[top++] = 2;
    }
    while(i*i<=b) {
        i+=2;
        if(b%i)
            continue;
        f[top++] = i;
        while(b%i==0)
            b/=i;
    }
    if(b>1)
        f[top++] = b;
    for(int i=1; i<(1<<top); ++i) {
        tmp = 1;
        for(int j=0; i>=(1<<j); ++j)
            if(i&(1<<j))
                tmp*=f[j];
        if(cbits(i)&1)
            ans-=a/tmp;
        else
            ans+=a/tmp;
    }
    return ans;
}

int main(void) {
    FILE *fi = fopen("pinex.in","r");
    FILE *fo = fopen("pinex.out","w");
    int m, a, b;
    fscanf(fi,"%d",&m);
    while(m--) {
        fscanf(fi,"%d%d",&a,&b);
        fprintf(fo,"%d\n",pinex(a, b));
    }

    fclose(fi);
    fclose(fo);
    return 0;
}