uva 1478 - Delta Wave(递推+大数+卡特兰数+组合数学)
发布时间:2020-12-14 03:27:47 所属栏目:大数据 来源:网络整理
导读:题目链接:uva 1478 - Delta Wave 题目大意:对于每个位置来说,可以向上,水平,向下,坐标不能位负,每次上下移动最多为1, 给定n问说有多少种不同的图。结果对 10 1 00 取模。 解题思路:因为最后都要落回y=0的位置,所以上升的次数和下降的次数是相同的
题目链接:uva 1478 - Delta Wave 题目大意:对于每个位置来说,可以向上,水平,向下,坐标不能位负,每次上下移动最多为1, 给定n问说有多少种不同的图。结果对10100取模。 解题思路:因为最后都要落回y=0的位置,所以上升的次数和下降的次数是相同的,并且上升下降的关系满足出栈入栈的关系。即卡特兰数。 C(2?in)?f(i)=C(?2?1?n2i+?()) #include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long type;
const int MAXN = 10005;
struct bign {
int len,num[MAXN];
bign () {
len = 0;
memset(num,0,sizeof(num));
}
bign (int number) {*this = number;}
bign (char* number) {*this = number;}
void DelZero ();
void Put ();
void operator = (int number);
char* number);
bool operator < (const bign& b) const;
operator > (const { return b < *this; }
operator <= (return !(b < *this); }
operator >= (return !(*this < b); }
operator != (this || *this < b;}
operator == (return !(b != *this); }
operator ++ ();
operator -- ();
bign operator + (const type& b);
bign const bign& b);
bign operator - (operator * (operator / (const type& b);
//bign operator / (const bign& b);
int operator % (int& b);
};
/*Code*/
int main () {
int n;
while (scanf("%d",&n) == 1) {
bign ans = 0;
bign tmp = 1;
ans = ans + tmp;
for (int i = 1; i <= n/2; i++) {
tmp = tmp * 1LL * (n - 2 * i + 2) * (n - 1);
tmp = tmp / (1LL * i * (i + 1));;
ans = ans + tmp;
ans.len = min(ans.len,255)">100);
}
ans.Put();
printf("n");
}
}
void bign::DelZero () {
while (len && num[len-1] == 0)
len--;
if (len == 0)
num[len++] = 0;
}
void bign::Put () {
bool flag = false;
int i = len-1; i >= 0; i--) {
if (num[i] || flag) {
true;
}
}
}
void bign::char* number) {
len = strlen (number);
0; i < len; i++)
num[i] = number[len-i-1] - '0';
DelZero ();
}
int number) {
len = 0;
while (number) {
num[len++] = number%10;
number /= 10;
}
DelZero ();
}
bool bign::operator < (const {
if (len != b.len)
return len < b.len;
0; i--)
if (num[i] != b.num[i])
return num[i] < b.num[i];
return false;
}
operator ++ () {
int s = 1;
0; i < len; i++) {
s = s + num[i];
num[i] = s % 10;
s /= 10;
if (!s) break;
}
while (s) {
num[len++] = s%10;
}
}
operator -- () {
if (num[0] == 0 && len == 1) return;
int s = -1;
0; i < len; i++) {
s = s + num[i];
num[i] = (s + 10) % if (s >= 0) break;
}
DelZero ();
}
bign bign::const type& b) {
bign a = b;
return *this + a;
}
bign bign::const bign& b) {
type bignSum = 0;
bign ans;
0; i < len || i < b.len; i++) {
if (i < len) bignSum += num[i];
if (i < b.len) bignSum += b.num[i];
ans.num[ans.len++] = bignSum % 10;
bignSum /= 10;
}
while (bignSum) {
ans.num[ans.len++] = bignSum % return ans;
}
bign bign::this - a;
}
bign bign::const bign& b) {
type bignSub = 0;
bign ans;
0; i < len || i < b.len; i++) {
bignSub += num[i];
bignSub -= b.num[i];
ans.num[ans.len++] = (bignSub + if (bignSub < 0) bignSub = -1;
else bignSub = 0;
}
ans.DelZero ();
const type& b) {
type bignSum = 0;
bign ans;
ans.len = len;
0; i < len; i++) {
bignSum += num[i] * b;
ans.num[i] = bignSum % 10;
}
const bign& b) {
bign ans;
ans.len = 0;
0; i < len; i++){
int bignSum = 0;
int j = 0; j < b.len; j++){
bignSum += num[i] * b.num[j] + ans.num[i+j];
ans.num[i+j] = bignSum % 10;
bignSum /= 10;
}
ans.len = i + b.len;
while (bignSum){
ans.num[ans.len++] = bignSum % 10;
}
}
const type& b) {
bign ans;
type s = 0; i--) {
s = s * 10 + num[i];
ans.num[i] = s/b;
s %= b;
}
ans.len = len;
ans.DelZero ();
return ans;
}
int bign::int& b) {
bign ans;
10 + num[i];
ans.num[i] = s/b;
s %= b;
}
return s;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |