C小白。Py过了。但是C就是过不了。非常难受。在线蹲大佬。

P2181 对角线

/2 /3 /4不能放在一起除吧,int、longlong类型是自动**向下取整**的,不像double有精度,计算顺序很重要
by Dream_weavers @ 2022-05-09 23:17:22


楼上也对 $10^5\times4=10^{20}$ longlong存不下
by Dream_weavers @ 2022-05-09 23:21:48


@[Dream_weavers](/user/572482) 那怎么半啊
by yydss_a_b_e_ryyds @ 2022-05-09 23:25:10


@[yydss_a_b_e_ryyds](/user/726562) 很简单 ```cpp #include<stdio.h> int main() { unsigned long long n; scanf("%lld",&n); printf("%lld",n*(n-1)/2*(n-2)/3*(n-3)/4); return 0; } ```
by Dream_weavers @ 2022-05-09 23:26:04


@[Dream_weavers](/user/572482) 感谢感谢,我研究一下,我不是很熟悉,感谢感谢。
by yydss_a_b_e_ryyds @ 2022-05-09 23:29:00


@[yydss_a_b_e_ryyds](/user/726562) py 过了是自带高精度,所以: ```cpp #include<bits/stdc++.h> #define int __int128 namespace Newstd { char buf[1 << 21],*p1 = buf,*p2 = buf; inline int getc() { return p1 == p2 && (p2 = (p1 = buf) + fread(buf,1,1 << 21,stdin),p1 == p2) ? EOF : *p1 ++; } inline int read() { int ret = 0,f = 0;char ch = getc(); while (!isdigit(ch)) { if(ch == '-') f = 1; ch = getc(); } while (isdigit(ch)) { ret = (ret << 3) + (ret << 1) + ch - 48; ch = getc(); } return f ? -ret : ret; } inline void write(int x) { if(x < 0) { putchar('-'); x = -x; } if(x > 9) write(x / 10); putchar(x % 10 + '0'); } } signed main() { int n; n = Newstd::read(); Newstd::write(n*(n-1)*(n-2)*(n-3)/24); return 0; } ```
by Nodlek @ 2022-05-10 07:05:47


@[Dream_weavers](/user/572482) 这里并不存在 `/2 /3 /4` 会无法整除的情况,因为 $n,n-1,n-2,n-3$ 一定会包含
by Nodlek @ 2022-05-10 07:06:55


@[Nodlek](/user/519187) 感谢感谢,我研究一下
by yydss_a_b_e_ryyds @ 2022-05-25 09:09:58


n要开unsigned long long,不然存不下
by Wind_of_South @ 2022-07-13 20:50:23


@[yydss_a_b_e_ryyds](/user/726562) unsigned long long(无符号长整型) 你可以理解成把变量类型所占的空间变大,unsigned后面可以加变量类型 如:unsigned int,unsigned char 还有有符号类型(signed)感兴趣可以深入了解
by Bernie_qwq @ 2022-07-15 19:31:20


|