有K种不同的玫瑰花,现在要摆放在N个位置上,要求每种颜色的花至少出现过一次,请问有多少种不同的方案数呢?,因为答案可能很大,你只需要输出它对772235取余后的结果.
import sys import math if __name__=="__main__": line = list(map(int, sys.stdin.readline().strip().split())) k=line[1] n=line[0] value=[i+1 for i in range(k)] for j in range(1,k): key=[i+1 for i in range(value[j])] sum_=0 for i in range(j): key[i]=math.factorial(value[j])/(math.factorial(value[j]-key[i])*math.factorial(key[i])) temp1 = key[i]*value[i]%772235 sum_+=temp1 sum_=sum_%772235 temp2 = pow(value[j],n)%772235+772235 value[j]=int((temp2-sum_)%772235) print(value[k-1])
不会。如果是数学题就直接mma求和那个显式公式了
Needs["Combinatorica`"] f[n_Integer, k_Integer] := Sum[Multinomial @@ i, {i, # + ConstantArray[1, k] & /@ Compositions[n - k, k]}] f[3, 2]
另一种是
思路很容易懂,把个排列做了分类
代码欠着
#include<bits/stdc++.h> using namespace std; const int N = 5e4 + 5; typedef long long ll; const ll mod = 772235; ll Pow(ll a, ll b) { ll ans = 1; while (b) { if (b & 1) ans = ans * a % mod; a = a * a % mod; b >>= 1; } return ans; } ll C[35][35]; int main() { int n, k; scanf("%d%d", &n, &k); ll ans = Pow(k, n); int sign = -1; C[0][0] = 1; for (int i = 1; i <= k; i++) { C[i][0] = 1; for (int j = 1; j <= i; j++) C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod; } for (int i = 1; i <= k; i++) { ans += sign * (C[k][k - i] * Pow(k - i, n) % mod); ans = (ans + mod) % mod; sign *= -1; } printf("%lld\n", ans); return 0; }
import sys a = sys.stdin.readline().strip().split() mod = 772235 N = int(a[0]) K = int(a[1]) line1 = [1] * (N) if K > N: # 处理 K >N 的情况 print(0) else: pow = 1 for i in range(1,K): pow *= (i+1) line2 = [0] * (N) line2[i] = pow for j in range(i+1,N): line2[j] = (i+1) * (line1[j-1] + line2[j-1]) % mod line1 = line2 print(line1[-1])动态规划只与上一行有关,于是只保存一行
import java.util.Scanner; public class rose { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int N=sc.nextInt(); int M=sc.nextInt(); long a=jiecheng(N); long b=jiecheng(M-N); long c=a/b; System.out.println(c); } public static long jiecheng(int a){ long b=1; for (int i=1;i<=a;i++){ b=b*i; } return b; } }
#include<bits/stdc++.h> using namespace std; #define M 772235 int main(){ int N, k; cin >> N >> k; int a[2][k + 5]; int pre = 0, cur = 1; for(int i = 1; i <= N; i++){ pre = 1 - i % 2; cur = i % 2; for(int j = 1; j <= k; j++){ if(j == 1)a[cur][j] = 1; else if(i == j)a[cur][j] = j * a[pre][j - 1] % M; else if(i > j)a[cur][j] = j * (a[pre][j - 1] + a[pre][j]) % M; } } cout << a[cur][k] << endl; return 0; }
通过率:15% import java.util.*; import java.io.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int K = sc.nextInt(); long num = 0; if( N == K){ num = (long)Math.pow(2,N); System.out.println(num); }else if(N > K){ num = jie(N)/jie(K)/jie(N - K)*(long)Math.pow(2,K); System.out.println(num); }else{ System.out.println(0); } } public static long jie(int n){ long a = 1; while(n >= 1){ a = a*n; n = n - 1; } return a; } }
#include <bits/stdc++.h> using namespace std; const int maxn = 50000 + 7; const int mod = 772235; int n, m; int dp[maxn][32]; int main(){ scanf("%d %d", &n, &m); dp[1][1] = 1; for(int i = 2; i <= n; ++i) for(int j = 1; j <= m; ++j) dp[i][j] = (dp[i-1][j-1] + dp[i-1][j]) % mod * j % mod; cout << dp[n][m] << endl; return 0; }