Pagini recente » Istoria paginii runda/nu_merge_arhiva_de_probleme/clasament | Cod sursa (job #2300943) | Cod sursa (job #1548052) | Istoria paginii runda/simulare-cartita-32 | Cod sursa (job #1567793)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <bitset>
#define maxim 1000005
using namespace std;
long long int A,B;
int m;
bitset<maxim> prim;
int nprim[105];
int factori[80005];
void descomp(int b);
void solve(int a,int b)
{
descomp(b);
int lmax=(1<<factori[0])-1;
int s;
int sum_one;
int mm=0;
for(int x=1;x<=lmax;x++)
{
s=1;
sum_one=0;
for(int i=1;i<=factori[0];i++)
if(x & (1<< (i-1)))
{s*=factori[i];
sum_one++;
}
if(sum_one%2==1)
mm+=a/s;
else mm-=a/s;
}
printf("%d\n",a-mm);
}
void descomp(int b)
{
for(int i=1;i<=nprim[0] && nprim[i]<=b;i++)
if(b%nprim[i]==0)
{factori[++factori[0]]=nprim[i];
while(b!=1 && b%nprim[i]==0)
b/=nprim[i];
}
if(factori[0]==0)
{
nprim[++nprim[0]]=b;
factori[++factori[0]]=b;
}
}
void ciur()
{
for(int i=2;i<=maxim;i+=2)
prim[i]=1;
nprim[++nprim[0]]=2;
for(int i=3;i<=maxim;i+=2)
if(prim[i]==0)
{nprim[++nprim[0]]=i;
for(int j=i;j<=maxim;j+=i)
prim[j]=1;}
}
void read()
{
scanf("%d ",&m);
ciur();
for(int i=1;i<=m;i++)
{scanf("%d %d",&A,&B);
factori[0]=0;
solve(A,B);}
}
int main()
{
freopen("pinex.in","r",stdin);
freopen("pinex.out","w",stdout);
read();
return 0;
}