Calculation Coefficient Dynamic Programming Fermat's Little Theorem Combinatorial Mathematics

Calculation Coefficient Dynamic Programming Fermat's Little Theorem Combinatorial Mathematics

Solution 1 Fermat's little theorem

Insert picture description here

#include<iostream>
using namespace std;

long long a,b,k,m,n;

const int p=10007;

long long fact(long long x,long long y)
{
    
    

long long ans=1;
long long t=x;

while(y)
{
    
    
    if(y&1)
        ans=ans*t%p;        
    t=t*t%p;

    y=y>>1;
}

return ans;
}

int main()
{
    
    

	cin>>a>>b>>k>>n>>m;
	long long las=1;
	
	long long s=k;
	for(long long i=n;i>=1;i--)
	{
    
    
	// cout<<s<<” “<<i<<endl;
	
	    las=las*(s--)%p;
	    las=las*fact(i,p-2)%p;
	}
	// cout<<las<<endl;
	// cout<<fact(a,n)%p<<endl;
	// cout<<fact(b,k-n)%p<<endl;
	
	cout<< (las*fact(a,n)%p)*fact(b,k-n)%p;


return 0;
}

Solution 2: Yanghui triangle dp
C(n,m)=C(n-1,m)+C(n-1,m-1)

#include<iostream>
using namespace std;

#define ll long long

ll f[1005][1005];

long long a,b,k,m,n;

const int p=10007;

long long fact(long long x,long long y)
{
    
    

	long long ans=1;
	long long t=x;
	
	while(y)
	{
    
    
	    if(y&1)
	        ans=ans*t%p;        
	    t=t*t%p;
	
	    y=y>>1;
	}
	
	return ans;
}
int main()
{
    
    
	
	for(int i=0;i<1005;i++)
		f[i][i]=1;
	
	for(int i=0;i<1005;i++)
	{
    
    
		f[i][0]=1;
	}
	
	for(int i=2;i<1005;i++)
		for(int j=1;j<i;j++)
		{
    
    
			f[i][j]=(f[i-1][j]+f[i-1][j-1])%p;
		}
		

	cin>>a>>b>>k>>n>>m;
	long long las=1;
	
	long long s=k;
	for(long long i=n;i>=1;i--)
	{
    
    
		
		
		las=las*(s--)%p;
		las=las*fact(i,p-2)%p;
	}
	


	cout<< (f[k][n]*fact(a,n)%p)*fact(b,k-n)%p;
	
	
	return 0;
}

Guess you like

Origin blog.csdn.net/weixin_45448563/article/details/113787608