entrada de la competencia algoritmo clásico combinación de varios procedimientos 4-1

entrada de la competencia algoritmo clásico combinación de varios procedimientos 4-1


Lo cual requiere una serie de factoriales aparece más de una vez con el fin de facilitar y garantizar el programa de limpieza, que se escribe como una función

#include<iostream>
using namespace std;
long long factorial(int n)
{
	long long m=1;
	for(int i=1;i<=n;i++)
	{
		m*=i;
	}
	return m;
}
long long c(int n,int m)
{
	return factorial(n)/(factorial(m)*factorial(n-m));
}
int main()
{
	int n,m;
	cin>>n>>m;
	long long res=c(n,m);
	cout<<res;
	return 0;
} 


Después de programar prueba de recuerdo
dentro de la gama de tipos de datos, incluso si la respuesta final seleccionada, los resultados intermedios de cálculos puede todavía desbordamiento.
Así que la clave: los resultados intermedios a desbordamiento evitar de
desbordamiento es partes factoriales: así, por alrededor de n puntos n / m = (m + 1 ) (m + 2) ... (n-1) n !!!

#include<iostream>
using namespace std;
long long c(int n,int m)
{
	//把大的那两个数直接约掉
	if(m<n-m) m=n-m;
	long long ans=1;
	for(int i=m+1;i<=n;i++)
	{
		ans*=i;
	}
	for(int i=1;i<=n-m;i++)
	ans/=i;
	return ans;	 
}
int main()
{
	int n,m;
	cin>>n>>m;
	long long res=c(n,m);
	cout<<res<<endl; 
	return 0;
}

Para simplificar las expresiones complejas a veces no sólo reducir la cantidad de cálculos, sino también para reducir o incluso evitar el desbordamiento de los resultados intermedios.
Esto es más o menos necesitan alguna información sobre el conocimiento del contenido de las matemáticas, la teoría de números

Supongo que te gusta

Origin www.cnblogs.com/serendipity-my/p/12635629.html
Recomendado
Clasificación