1. 程式人生 > >51nod 1829 函數

51nod 1829 函數

retext std F12 ons 函數 || ext 區別 n)

想知道f:A->B這個函數(其中|A|=n, |B|=m)的所有映射關系要使B的每個元素都要被A的一個元素覆蓋到。 數字可能很大你只要輸出方案數模1,000,000,007即可。 Input
一共一行兩個數,n和m。(1<=n,m<=1,000,000)
Output
一共一行包含一個方案數。
Input示例
2 2
Output示例
2

話說這個題當時並沒有想明白怎麽去做

給定n個有區別的小球,裝到m個有區別的箱子裏,且沒有箱子是空的,求方案數

技術分享圖片

技術分享圖片

所以就是C(m,0)*m^n-C(m,1)*(m-1)^n+...-...

#include<bits/stdc++.h>
using
namespace std; #include<bits/stdc++.h> using namespace std; const int MD=1e9+7,N=2e6+5; int f[N],v[N]; int C(int n,int m) { if(m<0||m>n) return 0; return 1LL*f[n]*v[m]%MD*v[n-m]%MD; } int la(int a,int x) { int ans=1; for(;x;a=a*1LL*a%MD,x>>=1)if(x&1)ans=ans*1LL*a%MD;
return ans; } int main() { f[0]=1; for (int i=1; i<N; i++) f[i]=1LL*f[i-1]*i%MD; v[N-1]=la(f[N-1],MD-2); for(int i=N-2; i>=0; i--) v[i]=v[i+1]*(i+1LL)%MD; int ans=0,n,m,t=-1; cin>>n>>m; for(int i=0;i<=m;i++)t=-t,ans=(t*C(m,i)*1LL*la(m-i,n)%MD+ans)%MD; cout
<<(ans+MD)%MD; return 0; }

51nod 1829 函數