Cod sursa(job #855753)

Utilizator auRSTARHreapca Aurelian auRSTAR Data 15 ianuarie 2013 16:17:35
Problema Principiul includerii si excluderii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<cstdio>
#include<vector>
#include<bitset>
#include<iostream>
#define LL long long
using namespace std;
int t,cnt,C[100010],nr,k;
LL a,b,SOL,i,j,sign=1;
bitset<1000010>B;
vector<LL> V[100];
int main()
{
    freopen("pinex.in","r",stdin);
    freopen("pinex.out","w",stdout);
    scanf("%d",&t);
    V[0].push_back(1);
    C[1]=2;nr=1;
    for(i=3;i<=1000003;i+=2)
    {
        if(B[i]==1)continue;
        C[++nr]=i;
        k=2*i;
        for(j=i*i;j<=1000003;j+=k)B[j]=1;
    }
    for(;t;--t)
    {
        cin>>a>>b;
        SOL=a;
        cnt=0;
        for(k=1;k<=nr;k++)
        {
            i=C[k];
            if(i*i>b)break;
            if(b%i)continue;
            while(!(b%i))b/=i;
            cnt++;
            for(j=cnt-1;j>=0;j--)for(vector<LL>::iterator it=V[j].begin();it!=V[j].end();it++)V[j+1].push_back((*it)*i);
        }
        if(b>1)
        {
            cnt++;
            for(j=cnt-1;j>=0;j--)for(vector<LL>::iterator it=V[j].begin();it!=V[j].end();it++)V[j+1].push_back((*it)*b);
        }
        for(j=1;j<=cnt;j++)
        {
            if(j&1)sign=-1; else sign=1;
            for(vector<LL>::iterator it=V[j].begin();it!=V[j].end();it++)if(*it<a)SOL+=sign*(a/(*it));
            V[j].resize(0);
        }
        cout<<SOL<<"\n";
    }
    return 0;
}