数论 A - 梦 -----acdream ACdream原创群赛(12)のBUAA选拔赛
  VrZI4Uwu8BR1 2023年11月02日 60 0


题解By  kuangbin:

直接数学公式搞。

n个非负整数的和为m的解个数为C(n+m-1,n-1)

如果其中一个位置选择了i, 那么其余的就是C(n-1 + m-i – 1, n-2), 这就是这个位置i出现次数,  然后位置有n个,再乘以n.

根据欧拉定理,指数对 1e9+6取模。

弱成狗。。。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<vector>
#include<iostream>
#include<string>
#include<queue>
#include<map>
#include<algorithm>
#include<math.h>
using namespace std;
//#define ull unsigned long long
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define eps 1e-7

ll c[2010][2010];
ll mod=1e9+6;
ll Mod=1e9+7;
ll C(ll n,ll k)    
{    
    if(c[n][k]!=-1) return c[n][k];    
    if(k==1) return c[n][k]=n;    
    if(k==0) return c[n][k]=1;    
    if(n==k) return c[n][k]=1;    
    if(k > (n>>1)) return c[n][k]=C(n,n-k);    
    return c[n][k]=(C(n-1,k-1)+C(n-1,k))%mod;    
}  
ll quickpow(ll m,ll n,ll k)  
{  
    ll b =1;  
    while (n >0)  
    {  
        if (n &1)  
            b = (b*m)%k;  
        n = n >>1 ;  
        m = (m*m)%k;  
    }  
    return b;  
}  

int main()
{
	int n,m,i,j,k;
	int t;
	scanf("%d",&t);
	memset(c,-1,sizeof(c));
	while(t--)
	{
		scanf("%d%d",&n,&m);
		if(n==1)
		{
			printf("%d\n",m);
			continue;
		}
		ll ans=1;
		for(i=2;i<=m;i++)
		{
			ans=(ans*quickpow((ll)i,C(n-2+m-i,m-i)*n,Mod))%Mod;
		}
		cout<<ans<<endl;
	}
}




【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
VrZI4Uwu8BR1