zoukankan      html  css  js  c++  java
  • 秀秀的照片

    Description

    华华在和秀秀视频时有截很多图。华华发现秀秀的每一张照片都很萌很可爱。为什么会这样呢?华华在仔细看过秀秀的所有照片后,发现秀秀的照片都具有一个相同的性质。

    设秀秀的分辨率为m×nm×n,即在水平方向上每一行有mm个像素,垂直方向上每一列有nn个像素,照片共有m×nm×n个像素。每一个像素都有一个颜色,共有kk种颜色。华华宝宝发现无论是沿着哪两列像素的分界线将秀秀的照片分成左右两半(共有m−1m−1种分法),左右两半不同颜色的种数都是相同的。

    华华宝宝把自己的发现告诉了秀秀宝宝。现在秀秀想知道当照片分辨率为m×nm×n,像素颜色种数为kk(不一定kk种颜色都出现)的时候,共有多少张不同的照片满足上面的性质。

    由于答案可能很大,你只需输出答案对109+7109+7取模的结果即可。


    题解


    代码

    #include <iostream>
    #include <cstdio>
    #define int long long
    using namespace std;
    const int mod=1e9+7;
    const int maxn=2003;
    int n,m,k,s[maxn][maxn];
    long long ans,inv[1000003],jie[1000003];
    long long qpow(long long a,long long b){
    	long long ans=1;
    	while(b){
    		if(b&1) ans=ans*a%mod;
    		a=a*a%mod; b>>=1;
    	}
    	return ans;
    }
    long long C(long long a,long long b){return jie[a]*inv[b]%mod*inv[a-b]%mod;}
    signed main()
    {
    	scanf("%lld%lld%lld",&n,&m,&k);
    	jie[0]=1; for(int i=1;i<=k;++i) jie[i]=jie[i-1]*i%mod;
    	inv[k]=qpow(jie[k],mod-2); for(int i=k-1;i>=0;--i) inv[i]=inv[i+1]*(i+1)%mod;
    	s[0][0]=1;
    	for(int i=1;i<=n;++i)
    		for(int j=1;j<=i;++j) s[i][j]=(s[i-1][j-1]+s[i-1][j]*j%mod)%mod;
    	for(int i=0;i<=min(n,k);++i)
    		for(int j=0;i+j<=n&&i+j+j<=k;++j)
    		{
    			long long tmp1=C(k,i)*qpow(i,(m-2)*n)%mod;
    			long long tmp2=C(k-i,j)*C(k-i-j,j)%mod;
    			long long tmp3=1ll*s[n][i+j]*jie[i+j]%mod;
    			long long tmp4=tmp3*tmp3%mod;
    			long long tmp5=tmp1*tmp2%mod;
    			ans=(ans+tmp5*tmp4%mod)%mod;
    		}
    	cout<<ans<<'
    ';
    	return 0;
    }
    
  • 相关阅读:
    golang 用tar打包文件或文件夹
    golang 最和谐的子序列
    golang 轮训加密算法
    golang map
    golang 队列
    golang 栈操作
    golang 多维数组
    golang 数组反转
    c# sendmessage control to scroll
    c# 启动的时候向其他程序传值
  • 原文地址:https://www.cnblogs.com/wuwendongxi/p/14075565.html
Copyright © 2011-2022 走看看