洛谷P1062 NOIP2006普及組 數列

2022-08-21 02:27:08 字數 1339 閱讀 3338

給定乙個正整數 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...