暴力解法
#include<bits/stdc++.h>
using namespace std;
int main()
{int n,m;cin>>n>>m;if(n<3||n>7||m<0){cout<<"-1";return 0;}int powN[10];//记录0-9的n次方for(int i=0;i<10;i++){powN[i]=(int)pow(i,n);}int low=(int) pow(10,n-1);int high=(int) pow(10,n);//从100-999long ans=0;//记录当前水仙花数int idx=0;//当前水仙花数是第几个for(int num=low;num<high;num++){int sum=0;//记录num各位数字n位数之和;//从低位到高位遍历num的每一位数字int num_cp=num;while(num_cp>0){sum+=powN[num_cp%10];num_cp/=10;}if(sum==num){ans=num;if(idx==m){cout<<ans;return 0;}idx++;}}long res=ans*m;cout<<res;return 0;
}
打表法
#include <bits/stdc++.h>using namespace std;int main() {int n, m;cin >> n >> m;if (n < 3 || n > 7 || m < 0) {cout << -1;return 0;}map<int, vector<int>> dic;dic[3] = {153, 370, 371, 407};dic[4] = {1634, 8208, 9474};dic[5] = {54748, 92727, 93084};dic[6] = {548834};dic[7] = {1741725, 4210818, 9800817, 9926315};if (m < dic[n].size()) {printf("%d", dic[n][m]);} else {printf("%lld", (long long) dic[n][dic[n].size() - 1] * m);}return 0;
}