藍橋杯2018年A組-試題D-第幾個幸運數

DawnTraveler發表於2024-04-09

0.題目

1.題解

1.1 DFS搜尋(失敗)

思路

思路很簡單,但是還有可能遇到重複的情況,比如像3->35->353 和 5->53->533 是重複的
但是遞迴過深,導致超時.

程式碼

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int ans = 0;
set<ll> s;
void DFS(ll num){
	if(num > 3579152125273545) return;	
	s.insert(num);
	DFS(num * 3);
	DFS(num * 5);
	DFS(num * 7);
}
 
int main(){
	DFS(1);
	for(auto num: s){
		cout << num << endl;
	}
	cout << s.size() - 1;
} 

1.2 暴力列舉

思路

這裡我們獲取相應的小於num的數的順序並不重要(因為我們只需要獲取總個數)
這裡其實就是 3^i * 5^j * 7^k 即為組成結構
但要注意,由於這裡包括了 i=0,j=0,k=0的情況,包含了1在裡面,需要減掉即可

程式碼

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll num = 59084709587505;
int ans = 0;
 
int main(){
	for(int i = 0; pow(3, i) < num; i++){
		for(int j = 0; pow(5, j) < num; j++){
			if(pow(3, i) * pow(5, j) > num) break;
			for(int k = 0; pow(7, k) < num; k++){
				if(pow(3, i) * pow(5, j) * pow(7, k) <= num) 
					ans++;
				else break;
			}
		}
	}
	cout << ans - 1;
	return 0;
} 

相關文章