//这是yxc dalao的代码 第一次交的 60000过不去
//#define fre yes
#include <cstdio>
const int N = 60000010;
long long ans[N], tt;
void multi(int b) {
long long t = 0;
for (int i = 0; i <= tt; i++) {
ans[i] = ans[i] * b + t;
t = ans[i] / 1000000000;
ans[i] %= 1000000000;
}
while(t) {
ans[++tt] = (t % 1000000000);
t /= 1000000000;
}
}
void div(int b) {
long long t = 0;
for (int i = tt; i >= 0; i--) {
ans[i] += t * 1000000000;
t = ans[i] % b;
ans[i] /= b;
}
while(ans[tt] == 0) tt--;
}
int main() {
static int n;
scanf("%d", &n);
tt = 0;
ans[0] = 1;
for (int i = n * 2, j = 1; j <= n; i--, j++) {
multi(i);
div(j);
}
div(n + 1);
printf("%lld", ans[tt]);
for (int i = tt - 1; i >= 0; i--) printf("%09lld", ans[i]);
puts("");
return 0;
}
然后我加了个inline 和 register 就能过了(hhh
可能这个代码更容易理解吧,如果有小伙伴不知道这两个是什么(可以百度QAQ)
//#define fre yes
#include <cstdio>
const int N = 60000010;
long long ans[N], tt;
inline void multi(int b) {
long long t = 0;
for (register int i = 0; i <= tt; i++) {
ans[i] = ans[i] * b + t;
t = ans[i] / 1000000000;
ans[i] %= 1000000000;
}
while(t) {
ans[++tt] = (t % 1000000000);
t /= 1000000000;
}
}
inline void div(int b) {
long long t = 0;
for (register int i = tt; i >= 0; i--) {
ans[i] += t * 1000000000;
t = ans[i] % b;
ans[i] /= b;
}
while(ans[tt] == 0) tt--;
}
int main() {
static int n;
scanf("%d", &n);
tt = 0;
ans[0] = 1;
for (register int i = n * 2, j = 1; j <= n; i--, j++) {
multi(i);
div(j);
}
div(n + 1);
printf("%lld", ans[tt]);
for (register int i = tt - 1; i >= 0; i--) printf("%09lld", ans[i]);
puts("");
return 0;
}
代码粘贴,T了???
哦哦好像改时限了
我这里AC了很多遍..。 不知道为什么 有人也跟我反馈了 但是现在我复制粘贴也能过..
有循环递归什么的,inline失效,主要是register的作用
…? inline就是优化递归的啊 会根据情况自动展开
似乎不是吧,你可以百度一下,说到底,内联只是一种建议,适用于简单函数,复杂函数(递归,循环......)你当然也可以建议,但是计算机可能并不会听从,内联类似于宏,优于宏
emmm 一次讲课听金牌dalao说的 反正说的是 能够根据情况优化递归 若递归过多 会展开递归 但不会增加速度 也就意味着inline无任何作用