當前位置:
首頁 >
简单搜索(多位自幂数)+数列网站
發布時間:2025/4/9
29
豆豆
生活随笔
收集整理的這篇文章主要介紹了
简单搜索(多位自幂数)+数列网站
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:
我們定義n位自冪數為:
如果x是n位數,x的各位的n次方的也為x,那么x為n位自冪數
求n位自冪數有哪些,0< n <=19,x > 0,排序后輸出
時限3000ms。
解法1:打表
首先,如果拿到一個數列,可以先試試這個網站:OEIS,輸入數列串,就會返回通項公式同時給出表,可以以后直接打表用。
解法2:搜索
怎么搜索??
暴力枚舉n位?最差情況9^19種情況,會炸。時間復雜度鏈接
其實我們觀察,174和741,其實是一種東西,所以求解自冪數的關鍵是求一個數x中它每一位數字重復出現的個數,至于這些數字怎么排列其實沒關系,我們要做的就是枚舉各個數字重復出現的個數即可。
代碼如下:
#include<cstdio> #include<string.h> #include<algorithm> using namespace std; typedef long long ll; int n, a[20], f[20], cnt; ll ans[20];//快速冪 ll poww(int a, int b) {ll ans = 1, base = a;while (b != 0) {if (b & 1 != 0)ans *= base;base *= base;b >>= 1;}return ans; }int calc(ll sum) {ll t = sum;int num = 0;memset(f, 0, sizeof(f));while (t) {ll tmp = t % 10;t /= 10;f[tmp] ++;num++;}return num; }//數字比較大,在爆ll的邊緣試探,所以這里拿double檢測一下 //ps是填充到哪個數字了,hs是還能填充幾個數字 void dfs(int ps, int hs, ll sum, double dbsum) {if (ps == 9) {a[ps] = hs;sum += (ll)hs*poww(9, n);dbsum += (double)hs*poww(9, n);if (dbsum <= 1e19&&sum > 0) {if (calc(sum) == n) {bool flag = 1;for (int i = 0; i <= 9; i++) {if (f[i] != a[i])flag = 0;}if (flag)ans[cnt++] = sum;}}return;}for (int i = 0; i <= hs; i++) {a[ps] = i;dfs(ps + 1, hs - i, sum + (ll)i*poww(ps, n), dbsum + (double)i*poww(ps, n));} }int main() {scanf("%d", &n);memset(ans, 0, sizeof(ans)); cnt = 0;dfs(0, n, 0, 0);if (!cnt) { printf("-1\n"); }else {sort(ans, ans + cnt);for (int i = 0; i < cnt; i++) {printf("%lld ", ans[i]);}printf("\n");}return 0; }轉載于:https://www.cnblogs.com/romaLzhih/p/9489819.html
總結
以上是生活随笔為你收集整理的简单搜索(多位自幂数)+数列网站的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何前后端分离?
- 下一篇: shell中字符串基本用法