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...