結果
| 問題 |
No.1653 Squarefree
|
| コンテスト | |
| ユーザー |
merlin
|
| 提出日時 | 2021-08-21 00:29:00 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 1,772 bytes |
| コンパイル時間 | 1,689 ms |
| コンパイル使用メモリ | 170,432 KB |
| 実行使用メモリ | 90,112 KB |
| 最終ジャッジ日時 | 2024-10-14 09:08:03 |
| 合計ジャッジ時間 | 63,245 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 16 TLE * 22 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const int N=17705360;
bool p[N]; int mob[N];
void mobius(int n)
{
int i,j;
for(i=0;i<=n;i++) {p[i]=false; mob[i]=1;}
for(i=2;i<=n;i++)
if(!p[i])
{
mob[i]=-1;
for(j=2;j<=n/i;j++)
{
p[i*j]=true;
mob[i*j]*=-1;
}
ll sq=1LL*i*i;
for(j=1;j<=n/sq;j++)
mob[j*i*i]=0;
}
}
int maxpower(ll n,int p)
{
if(n==0) return 1;
int l=1,r=(int)1e9,m,ans,i;
if(p==5) r=3190;
ans=r;
while(l<=r)
{
m=(l+r)>>1;
ll v=1;
for(i=0;i<p;i++) v*=m;
if(v<=n)
{
ans=m;
l=m+1;
}
else r=m-1;
}
return ans;
}
//https://smsxgz.github.io/post/pe/counting_square_free_numbers/
int squarefree(ll n,int imax,int d)
{
if(d==0) return 0;
vector<int> mxi;
int sum=0,i;
for(i=imax-1;i>0;i--)
{
int cur=1;
int root=maxpower(n/i,2),sqd=maxpower(root,2),j;
for(j=1;j<=root/(sqd+1);j++) cur-=1LL*(root/j-root/(j+1))*mob[j];
for(j=2;j<=sqd;j++)
if(root/j<=d) cur-=mob[root/j];
else cur-=mxi[imax-j*j*i-1];
mxi.push_back(cur);
sum+=cur;
}
return sum-(imax-1)*mob[d];
}
int main()
{
ll a,b;
cin>>a>>b;
a--;
int imax=maxpower(b,5),ima=maxpower(a,5);
int d=maxpower(b/imax,2),d2=maxpower(a/ima,2);
int dm=max(d,d2);
mobius(dm);
ll s1=0,s2=0; int i;
mob[0]=0;
for(i=1;i<=dm;i++)
{
if(i<=d) s1+=(b/(1LL*i*i))*mob[i];
if(i<=d2) s2+=(a/(1LL*i*i))*mob[i];
mob[i]+=mob[i-1];
}
s1+=squarefree(b,imax,d); s2+=squarefree(a,ima,d2);
cout<<(s1-s2)<<"\n";
return 0;
}
merlin