結果
問題 |
No.1653 Squarefree
|
ユーザー |
![]() |
提出日時 | 2021-08-29 02:18:24 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 806 ms / 2,000 ms |
コード長 | 896 bytes |
コンパイル時間 | 3,895 ms |
コンパイル使用メモリ | 230,028 KB |
実行使用メモリ | 15,092 KB |
最終ジャッジ日時 | 2024-11-22 01:41:45 |
合計ジャッジ時間 | 28,252 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 38 |
ソースコード
#include <bits/stdc++.h> using namespace std; #include <atcoder/all> using namespace atcoder; using ll=long long; using Graph=vector<vector<int>>; #define MAX 2000000 #define MOD 1000000007 #define INF 1000000000 int main(){ ll L,R; cin>>L>>R; vector<int> cnt(R-L+1,1); vector<ll> A(R-L+1); for(ll i=L;i<=R;i++){ A[i-L]=i; } for(ll i=2;i<=10000000;i++){ ll x=i*i; for(ll j=((L-1)/x+1)*x;j<=R;j+=x){ cnt[j-L]=0; } for(ll j=((L-1)/i+1)*i;j<=R;j+=i){ while(A[j-L]%i==0){ A[j-L]/=i; } } } for(ll i=L;i<=R;i++){ ll left=0; ll right=1000000001; while(left+1<right){ ll x=(left+right)/2; if(x*x<=A[i-L]){ left=x; }else{ right=x; } } if(left*left==A[i-L]&&left>1){ cnt[i-L]=0; } } int ans=0; for(ll i=L;i<=R;i++){ ans+=cnt[i-L]; } cout<<ans<<'\n'; }