天天看点

【入门1】顺序结构 P2181 对角线 数学结论+过程溢出,结果不溢出的处理

【入门1】顺序结构 P2181 对角线

【入门1】顺序结构

【入门1】顺序结构 P2181 对角线 数学结论+过程溢出,结果不溢出的处理
【入门1】顺序结构 P2181 对角线 数学结论+过程溢出,结果不溢出的处理

思路(这个思路不是自己想出来的,是查了数学的相关资料才得出的,凭空推导C(n,4)是做不到的)如下:

每一个四边形中,都有一个交点。

从顶点中,任选4个点,组成四边形。

对正五边形,C(5,4)=5

【入门1】顺序结构 P2181 对角线 数学结论+过程溢出,结果不溢出的处理

正六边形C(6,4)=C(6,2)=6*5/2*1=15

n=10^5,C(10^5,4)=10^5*(10^5-1)*(10^5-2)*(10^5-3)/(4*3*2*1)=4*10^18

2^63-1=9.0*10^18

计算过程中long long要溢出,但计算结果会溢出。

随机试试9*8*7*6,8*7*6*5,7*6*5*4,6*5*4*3,5*4*3*2,4*3*2*1

可以看到,一定有一个数可以整除3,一定有一个数可以整除4,一定有一个数可以整除2.

AC代码如下:

#include <bits/stdc++.h>
#define LL long long
LL a[5];
int main(){
	LL n,ans=1;
	int i;
	scanf("%lld",&n);
	for(i=0;i<4;i++)a[i]=n-i;
	for(i=0;i<4;i++)
		if(a[i]%3==0){a[i]/=3;break;}
	for(i=0;i<4;i++)
		if(a[i]%4==0){a[i]/=4;break;}
	for(i=0;i<4;i++)
		if(a[i]%2==0){a[i]/=2;break;}
	for(i=0;i<4;i++)ans*=a[i];
	printf("%lld\n",ans);
	return 0;
}
           

继续阅读