NIT演算法導論 字母序列 Betty 定理

2022-06-22 21:24:08 字數 1819 閱讀 5715

nit演算法導論 字母序列

考慮由兩個字母a和b構成的詞所組成的這樣乙個序列:序列中的第乙個詞是「a」,第k個詞是由第k-1個詞經過下面的變換得到:每個a替換為aab,以及每個b替換為a。容易看出每個詞是它的下乙個詞的起始部分,這些詞的起始部分相當於給出了乙個字母序列aabaabaaabaabaab……。問你第n個字母a在哪乙個位置出現?

乙個正整數n,(1<=n<=1000000)

位置序號。

​ 1000

​ 1414

一開始讀完題沒處下手,看看資料範圍蠻小的就打了個暴力,後來發現這玩意是個貝蒂定理,假設\(a\)第\(i\)次出現的位置是\(a_i\),\(b\)第\(i\)次出現的位置是\(b_i\),打個表發現\(b_i-a_i=2i\),那麼由令\(b=a+2\),代入貝蒂定理\(\frac+\frac=1\)得\(a=\sqrt 2,b=\sqrt 2+2\)那麼\(a_i=\lfloor \sqrt2 i\rfloor\),其實\(b_i\)也知道了是\(b_i=\lfloor(\sqrt2 +2)i \rfloor\) 話說這題目描述的樣例就是來坑人的

答案就是\(\lfloor \sqrt2 i\rfloor\)沒啥意思 貼個之前模擬的解法吧

#include #include #include #include #include using namespace __gnu_pbds;

using namespace std;

// freopen("k.in", "r", stdin);

// freopen("k.out", "w", stdout);

// clock_t c1 = clock();

// std::cerr << "time:" << clock() - c1 <<"ms" << std::endl;

//#pragma comment(linker, "/stack:1024000000,1024000000")

mt19937 rnd(time(null));

#define de(a) cout << #a << " = " << a << endl

#define rep(i, a, n) for (int i = a; i <= n; i++)

#define per(i, a, n) for (int i = n; i >= a; i--)

#define ls ((x) << 1)

#define rs ((x) << 1 | 1)

typedef long long ll;

typedef unsigned long long ull;

typedef pairpii;

typedef pairpdd;

typedef pairpcc;

typedef pairpll;

typedef vectorvi;

#define inf 0x3f3f3f3f

const ll inf = 0x3f3f3f3f3f3f3f3f;

const int maxn = 1e6 + 7;

const int maxm = 4e5 + 7;

const ll mod = 1e9 + 7;

const double eps = 1e-7;

const double pi = acos(-1.0);

int main()

else

temp += "a";

if (cnt == n)

}a = temp;

}where:

printf("%d\n", ans);

}return 0;

}

演算法導論 最長遞增子串行

華電北風吹 日期 2016 2 20 問題描述 例如陣列arr 1,5,8,2,3,4 的最長遞增子串行是1,2,3,4 動態規劃求解。對於陣列中的每個元素,從前往後計算每個元素的狀態 到這個元素為止所構成的最長遞增子串行。時間複雜度 n2 include include using namespa...

演算法導論之最長遞增子串行

習題15.4 5,15.4 6 長度為n的陣列,尋找最長遞增子串行。要求 1 時間複雜度o n 2 2 時間複雜度o n lg n 解 可以利用公共子串行來解,將陣列a排序得到a 則a與a 的最大公共子串行即為所求,o n n 下面的兩種方法都是直接基於動態規劃。設輸入序列為a 1 n 以a i 作...

演算法導論 最長公共子串行

華電北風吹 日期 2016 2 24 問題描述 給定兩個序列x x1,x2,x m 和y y1,y 2,yn 求 x 和 y的長度最長的公共子串行。子串行 給定乙個序列x x1,x2,x m 若另乙個序列z z1,z2,z k 滿足存在乙個嚴格遞增的下標序列i1 i2,ik使得對所有的j 1,2,k...