# Dynamic Programming# String Manipulation# Math

c874 - 107北二1.雪花片片

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算 Koch 曲線從 N=1 到 N 的等邊三角形總數量。Koch 曲線的三角形數量呈現指數增長,N=1 時有 1 個三角形,N=2 時有 4 個,N=3 時有 16 個,以此類推。

解題思路

題目中,N=1 時三角形數量為 1,N=2 時為 1+4=5,N=3 時為 1+4+16=21。可以觀察到,第 i 個 Koch 曲線的三角形數量為 4^(i-1)。因此,從 1 到 N 的總數量可以表示為一個等比級數的和:1 + 4 + 16 + ... + 4^(N-1)。 程式碼中,a[i] 儲存 4^(i-1) 的值,b[i] 儲存從 1 到 i 的三角形總數。程式先預先計算 ab 陣列,然後根據輸入的 N 輸出 b[N-1]。 程式使用字串來表示大數,並使用 add 函數來進行大數加法。

複雜度分析

  • 時間複雜度: O(N) (預計算陣列需要 O(N) 時間,查詢則為 O(1))
  • 空間複雜度: O(N) (儲存 ab 陣列)

程式碼

#include <iostream>
#include <string>
using namespace std;
string a[121]={"1"},b[121]={"1"};
inline string add(string x,string y){
	int xl=x.length(),yl=y.length();
	bool add=0;
	for(int i=xl-1,j=yl-1;i>=0;--i,--j){
		y[j]+=x[i]-48;
		if(y[j]>'9'){
			y[j]-=10;
			if(j==0)
				add=1;	
			else
				++y[j-1];
		}
	}
	if(add)
		y='1'+y;
	return y;
}
int main(){
	for(int i=0;i<120;++i){
		a[i+1]=add(a[i],a[i]);
		a[i+1]=add(a[i+1],a[i+1]);
		b[i+1]=add(b[i],a[i+1]);
	}
	int n;
	while(cin >> n)
		cout << b[n-1] << "\n";
}

Discussion