题解 P5727 【【深基5.例3】冰雹猜想】

· · 题解

题解

给大家科普一下,就是main()函数是可以用来递归的。

那我们就可以这样做:

#include<bits/stdc++.h>
using namespace std;
int n,p,top,a[10001];
//p代表是否输入过
int main(){
    if(!p){
        cin>>n;p=1;
        a[++top]=n;
            //输入并存进第一次结果
    }
    if(n==1){
        for(int i=top;i>=1;--i){
            cout<<a[i]<<' ';
        }
            //输出结果
        return 0;
            //用main()函数递归一定要退出!!
    }
    if(n%2==1){
        n=n*3+1;
    }else{
        n/=2;
    }
    //判断是奇数还是偶数,并进行相应处理
    a[++top]=n;
    //存进结果
    main();//递归调用
}

当然,这样既费时间又费空间。

k = 该算法运算次数 ,则: (注意,k一般不等于n)

显而易见,此方法的时间复杂度为

$O(k)$. 那如果这里的$n$的范围设置成$1<=n<=10^{7}$,那无论是递归还是用栈和$while$都会超时。 这时,我们就只能用一种时间复杂度为$O(1)$,空间复杂度亦为$O(1)$的算法—打表了。 那我们就只需要挂着程序,把表打出来即可。 表其实可以不用数组存,但我就不放不用数组的代码了,所以空间复杂度比$O(k)$大一些,请各位见谅。 ## Code&list(表): ```cpp #include<bits/stdc++.h> using namespace std; int a[101][1001]={{0},{1},{1,2},{1,2,4,8,16,5,10,3},{1,2,4},{1,2,4,8,16,5},{1,2,4,8,16,5,10,3,6},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,7},{1,2,4,8},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,7,14,28,9},{1,2,4,8,16,5,10},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11},{1,2,4,8,16,5,10,3,6,12},{1,2,4,8,16,5,10,20,40,13},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,7,14},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23,46,15},{1,2,4,8,16},{1,2,4,8,16,5,10,20,40,13,26,52,17},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,7,14,28,9,18},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,44,88,29,58,19},{1,2,4,8,16,5,10,20},{1,2,4,8,16,32,64,21},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23},{1,2,4,8,16,5,10,3,6,12,24},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,44,88,29,58,19,38,76,25},{1,2,4,8,16,5,10,20,40,13,26},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23,46,92,184,61,122,244,488,976,325,650,1300,433,866,1732,577,1154,2308,4616,9232,3077,6154,2051,4102,1367,2734,911,1822,3644,7288,2429,4858,1619,3238,1079,2158,719,1438,479,958,319,638,1276,425,850,283,566,1132,377,754,251,502,167,334,668,1336,445,890,1780,593,1186,395,790,263,526,175,350,700,233,466,155,310,103,206,412,137,274,91,182,364,121,242,484,161,322,107,214,71,142,47,94,31,62,124,41,82,27},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,7,14,28},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,44,88,29},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23,46,15,30},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23,46,92,184,61,122,244,488,976,325,650,1300,433,866,1732,577,1154,2308,4616,9232,3077,6154,2051,4102,1367,2734,911,1822,3644,7288,2429,4858,1619,3238,1079,2158,719,1438,479,958,319,638,1276,425,850,283,566,1132,377,754,251,502,167,334,668,1336,445,890,1780,593,1186,395,790,263,526,175,350,700,233,466,155,310,103,206,412,137,274,91,182,364,121,242,484,161,322,107,214,71,142,47,94,31},{1,2,4,8,16,32},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,44,88,29,58,19,38,76,25,50,100,33},{1,2,4,8,16,5,10,20,40,13,26,52,17,34},{1,2,4,8,16,5,10,20,40,80,160,53,106,35},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,7,14,28,9,18,36},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,7,14,28,56,112,37},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,44,88,29,58,19,38},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,44,88,29,58,19,38,76,152,304,101,202,67,134,268,89,178,59,118,39},{1,2,4,8,16,5,10,20,40},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23,46,92,184,61,122,244,488,976,325,650,1300,433,866,1732,577,1154,2308,4616,9232,3077,6154,2051,4102,1367,2734,911,1822,3644,7288,2429,4858,1619,3238,1079,2158,719,1438,479,958,319,638,1276,425,850,283,566,1132,377,754,251,502,167,334,668,1336,445,890,1780,593,1186,395,790,263,526,175,350,700,233,466,155,310,103,206,412,137,274,91,182,364,121,242,484,161,322,107,214,71,142,47,94,31,62,124,41},{1,2,4,8,16,32,64,21,42},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,7,14,28,56,112,37,74,148,49,98,196,65,130,43},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,44},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,68,136,45},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23,46},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23,46,92,184,61,122,244,488,976,325,650,1300,433,866,1732,577,1154,2308,4616,9232,3077,6154,2051,4102,1367,2734,911,1822,3644,7288,2429,4858,1619,3238,1079,2158,719,1438,479,958,319,638,1276,425,850,283,566,1132,377,754,251,502,167,334,668,1336,445,890,1780,593,1186,395,790,263,526,175,350,700,233,466,155,310,103,206,412,137,274,91,182,364,121,242,484,161,322,107,214,71,142,47},{1,2,4,8,16,5,10,3,6,12,24,48},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,7,14,28,56,112,37,74,148,49},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,44,88,29,58,19,38,76,25,50},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,44,88,29,58,116,232,77,154,51},{1,2,4,8,16,5,10,20,40,13,26,52},{1,2,4,8,16,5,10,20,40,80,160,53},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23,46,92,184,61,122,244,488,976,325,650,1300,433,866,1732,577,1154,2308,4616,9232,3077,6154,2051,4102,1367,2734,911,1822,3644,7288,2429,4858,1619,3238,1079,2158,719,1438,479,958,319,638,1276,425,850,283,566,1132,377,754,251,502,167,334,668,1336,445,890,1780,593,1186,395,790,263,526,175,350,700,233,466,155,310,103,206,412,137,274,91,182,364,121,242,484,161,322,107,214,71,142,47,94,31,62,124,41,82,27,54},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23,46,92,184,61,122,244,488,976,325,650,1300,433,866,1732,577,1154,2308,4616,9232,3077,6154,2051,4102,1367,2734,911,1822,3644,7288,2429,4858,1619,3238,1079,2158,719,1438,479,958,319,638,1276,425,850,283,566,1132,377,754,251,502,167,334,668,1336,445,890,1780,593,1186,395,790,263,526,175,350,700,233,466,155,310,103,206,412,137,274,91,182,364,121,242,484,161,322,107,214,71,142,47,94,188,376,125,250,83,166,55},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,7,14,28,56},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,7,14,28,56,112,37,74,148,49,98,196,65,130,43,86,172,57},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,44,88,29,58},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,44,88,29,58,19,38,76,152,304,101,202,67,134,268,89,178,59},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23,46,15,30,60},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23,46,92,184,61},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23,46,92,184,61,122,244,488,976,325,650,1300,433,866,1732,577,1154,2308,4616,9232,3077,6154,2051,4102,1367,2734,911,1822,3644,7288,2429,4858,1619,3238,1079,2158,719,1438,479,958,319,638,1276,425,850,283,566,1132,377,754,251,502,167,334,668,1336,445,890,1780,593,1186,395,790,263,526,175,350,700,233,466,155,310,103,206,412,137,274,91,182,364,121,242,484,161,322,107,214,71,142,47,94,31,62},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23,46,92,184,61,122,244,488,976,325,650,1300,433,866,1732,577,1154,2308,4616,9232,3077,6154,2051,4102,1367,2734,911,1822,3644,7288,2429,4858,1619,3238,1079,2158,719,1438,479,958,319,638,1276,425,850,283,566,1132,377,754,251,502,167,334,668,1336,445,890,1780,593,1186,395,790,263,526,175,350,700,233,466,155,310,103,206,412,137,274,91,182,364,728,1456,485,970,323,646,215,430,143,286,95,190,63},{1,2,4,8,16,32,64},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,7,14,28,56,112,37,74,148,49,98,196,65},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,44,88,29,58,19,38,76,25,50,100,33,66},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,44,88,29,58,19,38,76,152,304,101,202,67},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,68},{1,2,4,8,16,5,10,20,40,13,26,52,104,208,69},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23,46,92,184,61,122,244,488,976,325,650,1300,433,866,1732,577,1154,2308,4616,9232,3077,6154,2051,4102,1367,2734,911,1822,3644,7288,2429,4858,1619,3238,1079,2158,719,1438,479,958,319,638,1276,425,850,283,566,1132,377,754,251,502,167,334,668,1336,445,890,1780,593,1186,395,790,263,526,175,350,700,233,466,155,310,103,206,412,137,274,91,182,364,121,242,484,161,322,107,214,71},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,7,14,28,9,18,36,72},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23,46,92,184,61,122,244,488,976,325,650,1300,433,866,1732,577,1154,2308,4616,9232,3077,6154,2051,4102,1367,2734,911,1822,3644,7288,2429,4858,1619,3238,1079,2158,719,1438,479,958,319,638,1276,425,850,283,566,1132,377,754,251,502,167,334,668,1336,445,890,1780,593,1186,395,790,263,526,175,350,700,233,466,155,310,103,206,412,137,274,91,182,364,121,242,484,161,322,107,214,71,142,47,94,188,376,125,250,83,166,55,110,220,73},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,7,14,28,56,112,37,74},{1,2,4,8,16,32,64,128,256,85,170,340,113,226,75},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,44,88,29,58,19,38,76},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,44,88,29,58,116,232,77},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,44,88,29,58,19,38,76,152,304,101,202,67,134,268,89,178,59,118,39,78},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,44,88,29,58,19,38,76,152,304,101,202,404,808,269,538,179,358,119,238,79},{1,2,4,8,16,5,10,20,40,80},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23,46,92,184,61,122,244,81},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23,46,92,184,61,122,244,488,976,325,650,1300,433,866,1732,577,1154,2308,4616,9232,3077,6154,2051,4102,1367,2734,911,1822,3644,7288,2429,4858,1619,3238,1079,2158,719,1438,479,958,319,638,1276,425,850,283,566,1132,377,754,251,502,167,334,668,1336,445,890,1780,593,1186,395,790,263,526,175,350,700,233,466,155,310,103,206,412,137,274,91,182,364,121,242,484,161,322,107,214,71,142,47,94,31,62,124,41,82},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23,46,92,184,61,122,244,488,976,325,650,1300,433,866,1732,577,1154,2308,4616,9232,3077,6154,2051,4102,1367,2734,911,1822,3644,7288,2429,4858,1619,3238,1079,2158,719,1438,479,958,319,638,1276,425,850,283,566,1132,377,754,251,502,167,334,668,1336,445,890,1780,593,1186,395,790,263,526,175,350,700,233,466,155,310,103,206,412,137,274,91,182,364,121,242,484,161,322,107,214,71,142,47,94,188,376,125,250,83},{1,2,4,8,16,32,64,21,42,84},{1,2,4,8,16,32,64,128,256,85},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,7,14,28,56,112,37,74,148,49,98,196,65,130,43,86},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,7,14,28,56,112,37,74,148,296,592,197,394,131,262,87},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,44,88},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,44,88,29,58,19,38,76,152,304,101,202,67,134,268,89},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,68,136,45,90},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23,46,92,184,61,122,244,488,976,325,650,1300,433,866,1732,577,1154,2308,4616,9232,3077,6154,2051,4102,1367,2734,911,1822,3644,7288,2429,4858,1619,3238,1079,2158,719,1438,479,958,319,638,1276,425,850,283,566,1132,377,754,251,502,167,334,668,1336,445,890,1780,593,1186,395,790,263,526,175,350,700,233,466,155,310,103,206,412,137,274,91},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23,46,92},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,140,280,93},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23,46,92,184,61,122,244,488,976,325,650,1300,433,866,1732,577,1154,2308,4616,9232,3077,6154,2051,4102,1367,2734,911,1822,3644,7288,2429,4858,1619,3238,1079,2158,719,1438,479,958,319,638,1276,425,850,283,566,1132,377,754,251,502,167,334,668,1336,445,890,1780,593,1186,395,790,263,526,175,350,700,233,466,155,310,103,206,412,137,274,91,182,364,121,242,484,161,322,107,214,71,142,47,94},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23,46,92,184,61,122,244,488,976,325,650,1300,433,866,1732,577,1154,2308,4616,9232,3077,6154,2051,4102,1367,2734,911,1822,3644,7288,2429,4858,1619,3238,1079,2158,719,1438,479,958,319,638,1276,425,850,283,566,1132,377,754,251,502,167,334,668,1336,445,890,1780,593,1186,395,790,263,526,175,350,700,233,466,155,310,103,206,412,137,274,91,182,364,728,1456,485,970,323,646,215,430,143,286,95},{1,2,4,8,16,5,10,3,6,12,24,48,96},{1,2,4,8,16,5,10,20,40,80,160,53,106,35,70,23,46,92,184,61,122,244,488,976,325,650,1300,433,866,1732,577,1154,2308,4616,9232,3077,6154,2051,4102,1367,2734,911,1822,3644,7288,2429,4858,1619,3238,1079,2158,719,1438,479,958,319,638,1276,425,850,283,566,1132,377,754,251,502,167,334,668,1336,445,890,1780,593,1186,395,790,263,526,175,350,700,233,466,155,310,103,206,412,137,274,91,182,364,121,242,484,161,322,107,214,71,142,47,94,188,376,125,250,83,166,55,110,220,73,146,292,97},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,7,14,28,56,112,37,74,148,49,98},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,7,14,28,56,112,224,448,149,298,99},{1,2,4,8,16,5,10,20,40,13,26,52,17,34,11,22,44,88,29,58,19,38,76,25,50,100}}; int main(){ int n; cin>>n; cout<<1<<' '; for(int i=0;i<=1001;i++){ if(a[n][i]>1)cout<<a[n][i]<<' '; } return 0; } ```