练习赛地址http://acm.hrbust.edu.cn/vj/index.php?c=contest-contest&cid=70
a.水。。。
b.暴力打表。。。
c.给四个正方形,求一个能覆盖他们的正方形的面积,其实能覆盖两个最大的正方形就一定能覆盖四个正方形,所以输出两个最大正方形的边长和~\(≧▽≦)/~啦啦啦
d.组合数学,dp[i][j],前表示i个里选j个有多少种情况。
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; const long long maxa = 104; const long long mod = 1000000007; long long dp[maxa][maxa*maxa]; long long a[maxa*maxa]; long long s[maxa*maxa]; long long c[maxa*maxa][maxa]; int main(){ for(long long i=0;i< maxa*maxa;i++) { for(long long j=0;j<maxa;j++) { if(!j||i==j) c[i][j]=1; else c[i][j]=c[i-1][j-1]+c[i-1][j]; c[i][j] %= mod; } } long long n; long long cas = 1; while(cin>>n){ memset(dp, 0, sizeof(dp)); for(long long i =0; i < n; i++){ cin>>a[i]; if(i == 0) s[i] = a[i]; else s[i] = s[i-1]+a[i]; } for(long long i = 0;i < n; i++){ if(i == 0){ for(long long j = 0; j <= a[i]; j++){ dp[i][j] = 1; } }else{ for(long long j = 0; j <= a[i]; j++){ for(long long k = 0;k <= s[i-1]; k++){ dp[i][j+k] += dp[i-1][k]*(c[j+k][j]); dp[i][j+k] %= mod; } } } } long long ans = 0; for(long long i = 1; i <= s[n-1]; i++){ ans += dp[n-1][i]; ans %= mod; } cout<<"Case "<<cas++<<": "<<ans<<"\n"; } }