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

2021年09月15日 阅读数:1
这篇文章主要向大家介绍【入门1】顺序结构 P2181 对角线 数学结论+过程溢出,结果不溢出的处理,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

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

【入门1】顺序结构url

思路(这个思路不是本身想出来的,是查了数学的相关资料才得出的,凭空推导C(n,4)是作不到的)以下:spa

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

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

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

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

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^18it

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

随机试试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;
}