Cod sursa(job #2773141)

Utilizator BlueLuca888Girbovan Robert Luca BlueLuca888 Data 4 septembrie 2021 23:15:04
Problema Principiul includerii si excluderii Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin  ("pinex.in");
ofstream fout ("pinex.out");

const int LIM = 1000000;
bitset <LIM + 5> ok;
int prim, p[100005];

int semn[]={-1, 1};
int t, a, b, sol;
int m, e, d[20];
int f[20];

void bt(int k, int crt, int lst){
    if(k > 1){
        sol += (a/crt) * semn[(k-1)%2];
        if(k > m)
            return;
    }

    for(int i=lst+1; i<=m; i++)
        bt(k+1, crt*d[i], i);
}

int main (){
    ok[0]=ok[1]=1;
    for(int i=4; i<=LIM; i+=2)
        ok[i]=1;
    for(int i=3; i<=LIM/i; i+=2)
        if(ok[i] == 0)
            for(int j=i*i; j<=LIM; j+=i)
                ok[j]=1;

    p[++prim]=2;
    for(int i=3; i<=LIM; i+=2)
        if(ok[i] == 0)
            p[++prim]=i;


    fin>>t;
    for(int test=1; test<=t; test++){
        fin>>a>>b;
        m=0; sol=0;

        for(int i=1; p[i] <= b / p[i]; i++){
            e=0;
            while(b%p[i] == 0){
                e=1;
                b/=p[i];
            }
            if(e)
                d[++m]=p[i];
        }
        if(b != 1)
            d[++m]=b;

        bt(1, 1, 0);
        fout<<a-sol<<"\n";
    }
    return 0;
}