mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
5ed1cf19d0
3200-3299
76 lines
1.3 KiB
C++
76 lines
1.3 KiB
C++
#include<stdio.h>
|
|
#include<string.h>
|
|
#include<math.h>
|
|
#include<iostream>
|
|
#define ll __int64
|
|
#define inf (ll) 1e18+300
|
|
#define eps 1e-9
|
|
using namespace std;
|
|
ll why=(ll)1<<31;
|
|
ll num[100];
|
|
ll quickpow(ll m,int n)
|
|
{
|
|
ll b=1;int k=n;
|
|
while (n>0)
|
|
{
|
|
if (n&1)
|
|
{
|
|
double judge=1.0*(inf)/b;
|
|
if (judge<m) return -1;
|
|
b*=m;
|
|
}
|
|
n=n>>1;
|
|
if (m>why&&n>0) return -1;
|
|
m=m*m;
|
|
}
|
|
return b;
|
|
}
|
|
ll find(ll x,int k)
|
|
{
|
|
ll l=1,r=(ll)pow(x,1.0/k);
|
|
ll tt,pp,qq;
|
|
pp=quickpow(r,k);
|
|
if (pp==x) return r;
|
|
if (pp>x||pp==-1) --r;
|
|
else
|
|
{
|
|
tt=quickpow(r+1,k);
|
|
if (tt!=-1&&tt<=x) ++r;
|
|
}
|
|
return r;
|
|
}
|
|
ll f(ll x)
|
|
{
|
|
int i,j,k;
|
|
ll ans=0;
|
|
if (x<=3) return x;
|
|
memset(num,0,sizeof(num));
|
|
num[1]=x;
|
|
for (i=2;i<63;++i)
|
|
{
|
|
num[i]=find(x,i)-1;
|
|
if (!num[i]) break;
|
|
}
|
|
k=i;
|
|
for (i=k-1;i>0;--i)
|
|
{
|
|
for (j=1;j<i;++j)
|
|
if (i%j==0) num[j]-=num[i];
|
|
}
|
|
ans=num[1];
|
|
for (i=2;i<k;++i)
|
|
{
|
|
ans+=(i*num[i]);
|
|
}
|
|
return ans;
|
|
}
|
|
int main ()
|
|
{
|
|
ll a,b;
|
|
while (scanf("%I64d%I64d",&a,&b)&&(a+b))
|
|
{
|
|
printf("%I64d\n",f(b)-f(a-1));
|
|
}
|
|
return 0;
|
|
}
|