給定乙個正整數 k(3≤k≤15) ,把所有k的方冪及所有有限個互不相等的k的方冪之和構成乙個遞增的序列,例如,當 k=3 時,這個序列是:
1,3,4,9,10,12,13,…
因為所有的底數k都是相同的,所以自然要想到把他們的指數分離出來~~。
例如這樣
然後把指數分離出來:
0,1,0+1,2,0+2,1+2,0+1+2,3....
這時候看可能沒什麼頭緒,但是再看一遍題目,你會發現題目中強調了兩個字qwq———————遞增。也就是說我們在確定第n項時,要從之前確定的n-1項中選出一項:
但是這樣做還有很大的缺陷,因為在前n-1項中,難免會有重複的項,舉個最簡單的例子:
0,1,0+1,2,0+2,1+2;
如果確立了第三項(0+1)的時候,對前面2項進行加法操作,明顯會造成重複,並且不符合題目要求(遞增和互不相等的方冪)。
那麼這個演算法就要進行改進。
在這裡定義一下:
單獨數:就是不是由加法操作得到的數(k的n次方那種qwq)
合成數:由單獨數+合成數或由合成數+合成數組成的數
所以對於每乙個合成數都有單獨數的參與,我們想,可不可以先預處理出k的1-n次方,顯然乙個快速冪就可以了,那麼再想想,如果每讀入到乙個單獨數,就可以用這個單獨數按照剛才的方式來得到後面的n-1項。
經過驗證顯然是可以的。
如樣例:k=3,n=100時:
用f[i]代表第i項,有:
令v=每乙個單獨數f[i]
f[++i]=k(1 to n) v+f[k]
至此這個題目的分析就好了.....
下面是**~
#include#define re register
#define ull unsigned long long
using namespace std;
int k,n,p;
ull a[1000],f[2000000];
inline int read() //讀入優化
inline void out(int x) //輸出優化
if(x > 9) out(x / 10);
putchar(x % 10 + '0');
}inline ull quick_pow(int r,int k) //快速冪
return ans;
}int main()
}} }
out(f[n]);
return 0;
}
洛谷p1062 數列
給定乙個正整數k 3 k 15 把所有k的方冪及所有有限個互不相等的k的方冪之和構成乙個遞增的序列,例如,當k 3時,這個序列是 1,3,4,9,10,12,13,該序列實際上就是 3 0,3 1,3 0 3 1,3 2,3 0 3 2,3 1 3 2,3 0 3 1 3 2,請你求出這個序列的第n...
洛谷P1062(數列)
題目 給定乙個正整數k 3 k 15 把所有k的方冪及所有有限個互不相等的k的方冪之和構成乙個遞增的序列,例如,當k 3時,這個序列是 1,3,4,9,10,12,13,即3 0,3 1,3 0 3 1 3 2,3 0 3 2,3 1 3 2,3 0 3 1 3 2 請你求出這個序列的第n項的值 用...
洛谷 P1062 數列
給定乙個正整數k 3 k 15 把所有k的方冪及所有有限個互不相等的k的方冪之和構成乙個遞增的序列,例如,當k 3時,這個序列是 1,3,4,9,10,12,13,該序列實際上就是 3 0,3 1,3 0 3 1,3 2,3 0 3 2,3 1 3 2,3 0 3 1 3 2,請你求出這個序列的第n...