Cod sursa(job #3304889)

Utilizator SGLDCASA SI PODUL SGLD Data 28 iulie 2025 13:20:26
Problema Principiul includerii si excluderii Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#include<vector>
using namespace std;
ifstream in("pinex.in");
ofstream out("pinex.out");
int A;
int sum=0;
bool ciur[1000001];
int divizori[12];
int y=1;
int a[12];
vector<int> prim;
void rec(int x)
{
    if(x>1)
    {
        int prod=1;
        for(int i=1; i<x; i++)
        {
            prod=prod*divizori[a[i]];
        }
        if(x%2==0)
        {
            sum=sum-A/prod;
        }
        else
        {
            sum=sum+A/prod;
        }
    }
    for(int i=a[x-1]+1; i<=y-1; i++)
    {
        a[x]=i;
        rec(x+1);
    }
}
void gen(int r)
{
    for(int i=0; prim[i]*prim[i]<=r; i++)
    {
        if(r%prim[i]==0)
        {
            divizori[y]=prim[i];
            y++;
            while(r%prim[i]==0)
            {
                r=r/prim[i];
            }
        }
    }
    if(r>1){
    divizori[y]=r;
    y++;
    }
}
int main()
{
    ciur[0]=ciur[1]=1;
    for(int i=2; i<=1000000; i++)
    {
        if(ciur[i]==0)
        {
            prim.push_back(i);
            for(int j=2; j*i<=1000000; j++)
            {
                ciur[i*j]=1;
            }
        }
    }
    int B,m;
    in>>m;
    for(int i=1; i<=m; i++)
    {
        in>>A>>B;
        y=1;
        gen(B);
        sum=A;
        rec(1);
        out<<sum<<endl;
    }

    return 0;
}