第几个幸运数
到x星球旅行的游客都被发给一个整数,作为游客编号。
x星的国王有个怪癖,他只喜欢数字3,5和7。
国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品。
我们来看前10个幸运数字是:
3 5 7 9 15 21 25 27 35 45
因而第11个幸运数字是:49
小明领到了一个幸运数字 59084709587505,他去领奖的时候,人家要求他准确地说出这是第几个幸运数字,否则领不到奖品。
请你帮小明计算一下,59084709587505是第几个幸运数字。
需要提交的是一个整数,请不要填写任何多余内容。
思路:我的思路是暴力打出所有范围内的幸运数,去重后,二分查找幸运数字是第几个。看到网上有人是将已经找出的幸运数字放入优先队列中,然后每次出来的就是最小的数字,这样的话,就保证了数据的有序性,这个做法比较好。
答案为:1905
暴力代码如下:
#include<bits/stdc++.h>
#define ll long long
#define inf 1e14
using namespace std;
inline ll qsm(ll x,int y)
{
ll ans=1;
while(y)
{
if(y&1) ans=ans*x;
y>>=1;
x*=x;
}
return ans;
}
int main()
{
vector<ll> p;
for(int i=0;;i++)
{
if(qsm(3ll,i)>inf) break;
for(int j=0;;j++)
{
if(qsm(5ll,j)>inf) break;
if(qsm(3ll,i)*qsm(5ll,j)>inf) break;
for(int k=0;;k++)
{
if(qsm(7ll,k)>inf) break;
if(qsm(3ll,i)*qsm(5ll,j)>inf) break;
if(qsm(3ll,i)*qsm(5ll,j)*qsm(7ll,k)>inf) break;
p.push_back((ll)qsm(3ll,i)*qsm(5ll,j)*qsm(7ll,k));
}
}
}
sort(p.begin(),p.end());
p.erase(unique(p.begin(),p.end()),p.end());
p.erase(p.begin());//第一个为1,1不是幸运数,去掉。
int pos=lower_bound(p.begin(),p.end(),59084709587505)-p.begin();
cout<<pos+1<<endl;//数组下标是从0开始的,因此要+1.
return 0;
}
努力加油a啊,(o)/~