AtCoderC - Unexpressed 二分+思维

Posted karshey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoderC - Unexpressed 二分+思维相关的知识,希望对你有一定的参考价值。

C

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;
   
}

我真傻,真的。

以上是关于AtCoderC - Unexpressed 二分+思维的主要内容,如果未能解决你的问题,请参考以下文章

AtcoderC-Prison 区间问题

AtCoderC - Friends and Travel costs 模拟

AtCoderC - Distribution 优先队列+BFS

AtCoderC - Colorful Candies map+双指针

AtCoderC - Not Equal 思维题(类似排列组合)

二分 学习记录