Mai intai trebuie sa te autentifici.
Cod sursa(job #2171314)
Utilizator | Data | 15 martie 2018 11:54:04 | |
---|---|---|---|
Problema | Principiul includerii si excluderii | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.81 kb |
/*#include <fstream>
using namespace std;
ifstream fin ("submultimi.in");
ofstream fout("submultimi.out");
int x[30], n, nr;
/// generez toate sirurile de lungime n cu 0 si 1
void back(int pas) {
if (pas > n) {
nr++;
for (int i=1;i<=n;i++)
if (x[i] == 1)
fout<<i<<" ";
if (nr != 1)
fout<<"\n";
} else {
for (int i=0;i<=1;i++) {
x[pas] = i;
back(pas+1);
}
}
}
int main () {
fin>>n;
back(1);
return 0;
}
*/
#include <fstream>
#include <cmath>
using namespace std;
ifstream fin ("pinex.in");
ofstream fout ("pinex.out");
int t,x[100010],a[1000010],T,prim[100010],diviz[100010],A,B,i,k,j;
long long sol;
void back (int nivel){
if(nivel>t){
long long p=1;
int cnt=0;
for(int i=1;i<=t;i++)
if(x[i]){
cnt++;
p*=diviz[i];
}
if(cnt%2==0)
sol+=A/p;
else
sol-=A/p;
}
else{
for(int i=0;i<=1;i++){
x[nivel]=i;
back(nivel+1);
}
}
}
int main(){
for(i=2;i<=1000001;i++)
a[i]=1;
for(i=2;i*i<=1000001;i++)
if(a[i]){
prim[++k]=i;
for(j=i;j<=1000001/i;j++)
a[i*j]=0;
}
fin>>T;
for(;T>0;T--){
fin>>A>>B;
int b=B;
t=0;
int cnt=0;
for(i=1;i<=k && prim[i]*prim[i]<=B;i++){
if(b%prim[i]==0){
b/=prim[i];
cnt++;
}
if(cnt)
diviz[++t]=prim[i];
}
if(b>1)
diviz[++t]=b;
sol=0;
back(1);
fout<<sol<<"\n";
}
return 0;
}