Cod sursa(job #882191)

Utilizator unsilviuContvechidontdeactivatepls unsilviu Data 18 februarie 2013 22:22:48
Problema Principiul includerii si excluderii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <cmath>
#define MAXPRIM 1000001
using namespace std;

int n,m;
bitset<MAXPRIM> isprime;
vector <int> primes;
long long divs[31];

void sieve() {
    for (size_t i=2; i<MAXPRIM; i++)
        if (isprime[i])
            for (size_t j =i; j*i<MAXPRIM; j++)
                isprime[j*i]=0;
}

int main() {
    int i,j,nr,szd;
    long long a,b,bc,res,p,l;
    isprime.set();
    sieve();
    for (i=2; i<MAXPRIM; i++)
     if (isprime[i])
        primes.push_back(i);

    ifstream in("pinex.in");
    ofstream out("pinex.out");
    in>>m;
    for (i=1; i<=m; i++) {
        in>>a>>b;
        bc=b;
        res=0;
        szd=-1;
        //vector <long long> divs;

        for (j=0; j<primes.size()&&bc>1&&primes[j]<=sqrt(bc);j++)
            if (!(bc%primes[j])) {
                //divs.push_back(primes[j]);
                divs[++szd]=primes[j];
                while (!(bc%primes[j]))
                    bc/=primes[j];
            }

        if (bc!=1)
            //divs.push_back(bc);
            divs[++szd]=bc;

        /*j=-1;

        while(bc>1) {
            j++;
            if (!(bc%primes[j])) {
                divs[++szd] = primes[j];
                while (!(bc%primes[j]))
                    bc/=primes[j];
            }

            if (primes[j]>sqrt(bc)&&bc>1) {
                divs[++szd]=bc;
                bc=1;
            }


        }*/

        for (j=1; j<(1 << (szd)); j++) {
            p=1;
            nr=0;
            n=1;
            for (l=0; l< szd; l++)
                if ( (1 << l) & j) {
                    nr++;
                    p*=divs[l];
                }

            if (!(nr%2))
                n=-1;

            res+= n*(a/p);

        }

        res=a-res;

        out<<res<<'\n';
    }

    out.close();
    return 0;
}