害,一开始是想写一个check函数分解质因数判断一个数是否满足条件,再从1到目标数枚举求出最后的次数如下,结果可想而知。时间复杂度太大,而且好像也运行不了。
#include<bits/stdc++.h>
using namespace std;
int cnt;
typedef long long LL;
const LL ans=59084709587505;
bool check(LL a)
{
for(int i=2;i<=a/i;i++)
{
if(a%i==0)
{
while(a%i==0)
{
if(i!=3&&i!=5&&i!=7) return false;
a/=i;
}
}
}
if(a>1)
{
if(a!=3&&a!=5&&a!=7) return false;
}
return true;
}
int main()
{
for(LL i=2;i<=ans;i++)
{
if(check(i))
{
cnt++;
}
}
cout<<cnt<<endl;
return 0;
}
后来就想到,其实满足条件的数其实都是3 5 7 乘起来组合起来的数。
#include<bits/stdc++.h>
using namespace std;
int cnt;
typedef long long LL;
const LL ans=59084709587505;
priority_queue<LL,vector<LL>,greater<LL>> heap;//用优先队列方式。
const int a[3]={3,5,7}; //分析可知幸运树其实就是357乘积,只要从小到大枚举就能求出答案cnt;
int main()
{
map<LL,int> m;
heap.push(1);
while(1)
{
auto t=heap.top();
heap.pop();
if(t==ans)
{
cout<<cnt<<endl;
break;
}
for(int i=0;i<3;i++)
{
LL tmp=t*a[i];
if(m[tmp]==0)
{heap.push(tmp);
m[tmp]=1;}
}
cnt++; //注意,1是第一个出来的,此时cnt为0;所以在判断t==ans时,cnt即为ans的位次
}
return 0;
}