Cod sursa(job #2174625)

Utilizator SoranaAureliaCatrina Sorana SoranaAurelia Data 16 martie 2018 12:47:15
Problema Principiul includerii si excluderii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <cstdio>
#include <bitset>
#include <string.h>
using namespace std;

long long n, a, b;
bitset <1000005>ciur;

long long div[1000005];

void ciurr()
{
    ciur[1]=1;
    for(int i=2; i<=1000005; i++)
        if(ciur[i]==0)
            for(int j=i+i; j<=1000005; j+=i)
                ciur[j]=1;
}
int k=0;
void diviz(int a, int b, int &k)
{
    k=0;
    if(b%2==0)
    {
        div[k++]=2;
        while(b%2==0)
            b/=2;
    }
    for(int d=3; d*d<=b; d+=2)
        if(b%d==0 && ciur[d]==0)
        {
            div[k++]=d;
            while(b%d==0)
                b/=d;
        }
    if(b!=1)
        div[k++]=b;
}

long long generare(int a, int b)
{
    long long nr=(1<<k);
    long long s=0;
    for(int i=1; i<nr; i++)
    {
        long long p=1;
        long long nrel=0;
        for(int j=0; j<k; j++)
            if(i & (1<<j))
            {
                p*=div[j];
                nrel++;
            }
        if(nrel%2 == 0)
            s=(s-a/p);
        else
            s=(s+a/p);
    }
    s=a-s;
    return s;
}
int main()
{
    freopen("pinex.in", "r", stdin);
    freopen("pinex.out", "w", stdout);
    scanf("%lld", &n);
    ciurr();
    for(int i=1; i<=n; i++)
    {
        scanf("%lld %lld", &a, &b);
        diviz(a,b,k);
        printf("%lld\n", generare(a,b));
        memset(div, 0, 1000005);
    }
    return 0;
}