赞
踩
1010的数据量,我竟然傻傻的想着打表。
实际上二分,枚举i的范围从2到sqrt(n),把其所有ix次方存进set;
输出n-s.size();
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> pii; #define pb push_back #define fi first #define se second #define mem(a,x) memset(a,x,sizeof(a)); #define db double #define fir(i,a,n) for(int i=a;i<=n;i++) const int inf=0x3f3f3f3f; const int MOD=1e9+7; //====================== const int N=2e5+10; ll n,ans; ll find_b(ll x) { // int l=1,r=35; ll ans=0; ll t=x; for(int i=1;i<=35;i++) { if(1ll*t*x>n) { ans=i;break; } else t*=x; } return ans; } set<ll>s; int main() { cin>>n; ans=n; for(ll i=2;i*i<=n;i++) { if(s.count(i)) continue; ll t=find_b(i); ll tt=i*i; for(ll j=2;j<=t;j++) { s.insert(tt); //cout<<tt<<endl; tt*=i; } } ans=n-s.size(); cout<<ans; return 0; } /* // set<ll>::iterator it; // for(it=s.begin();it!=s.end();it++) // { // cout<<*it<<endl; // } */
后来发现不用二分找边界,直接乘就是了,超过就跳出循环。
大佬代码:AtCoder
#include <bits/stdc++.h> using namespace std; #define ll long long ll n; int main() { vector<bool> aa(1e5+5); cin>>n; ll ans=n; for (ll i=2;i*i<=n;i++) { if (aa[i]==1) continue; ll temp=i*i; while (temp<=n) { ans--; if (temp<aa.size()) aa[temp]=1; temp*=i; } } cout<<ans<<endl; }
我真傻,真的。
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。