bzoj1002

来源:互联网 发布:ubuntu优麒麟 编辑:程序博客网 时间:2024/06/06 03:28

这题我的做法就是普通的找规律,至于证明嘛。。在我刷题任务完成后再说~先应试嘛

注意要分奇偶数

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;struct node {int p[51], size;}f[110];inline void print(node a) {int rec;for(int i = 50; i >= 0; --i) if(a.p[i] != 0) {rec = i; break;}for(int i = rec; i >= 0; --i) {printf("%d", a.p[i]);}return ;}inline void multi(node a, node b, node &c) {int rec = 0;for(int i = 0; i <= max(a.size, b.size) + 1; ++i) {rec+= a.p[i] + b.p[i];c.p[i] = rec % 10;rec/= 10;}if(c.p[max(a.size, b.size)] == 0) c.size = max(a.size, b.size);else c.size = max(a.size, b.size) + 1;return ;}inline void multip(node a, node &b) {node c;memset(c.p, 0, sizeof(c.p));c.size = 0;for(int i = 0; i < a.size; ++i)for(int j = 0; j < b.size; ++j)c.p[i + j]+= a.p[i] * b.p[j];for(int i = 0; i <= a.size + b.size; ++i) {if(c.p[i] >= 10) {c.p[i + 1]+= c.p[i]/10;c.p[i]%= 10;}}int rec = 0;for(int i = 50; i >= 0; --i) if(c.p[i] != 0) {rec = i + 1; break;}b.size = rec;memcpy(b.p, c.p, sizeof(b.p));return ;}int main() {//freopen("1002.in", "r", stdin);int n; scanf("%d", &n);memset(f, 0, sizeof(f));if(n % 2 == 1) {f[1].p[0] = 1; f[2].p[0] = 3;f[1].size = 1; f[2].size = 1;for(int i = 3; i <= n; ++i) {multi(f[i - 1], f[i - 2], f[i]);}multip(f[n], f[n]);print(f[n]);}else {f[1].p[0] = 1; f[2].p[0] = 2;f[1].size = 1; f[2].size = 1;for(int i = 3; i <= n - 1; ++i) {multi(f[i - 1], f[i - 2], f[i]);}multip(f[n - 1], f[n - 1]);node x; x.size = 1; node ans, ans1, ans2;memset(ans.p, 0, sizeof(ans.p));memset(ans2.p, 0, sizeof(ans.p));memset(ans1.p, 0, sizeof(ans.p));multi(f[n - 1], f[n - 1], ans);multi(ans, ans, ans1);multi(f[n - 1], ans1, ans2);//printf("%d\n",ans2.size);print(ans2);}return 0;}



原创粉丝点击