Pagini recente » Cod sursa (job #934378) | Cod sursa (job #1339011) | Cod sursa (job #555369) | Cod sursa (job #311582) | Cod sursa (job #882191)
Cod sursa(job #882191)
#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;
}