gym/101194 H Great Cells(思维,贡献法)
发布日期:2021-06-30 10:32:32 浏览次数:2 分类:技术文章

本文共 1401 字,大约阅读时间需要 4 分钟。

给每个格子填 [ 1 , k ] [1,k] [1,k]的数字,如果一个格子在这一行这一列是严格最大,说这个格子是好各自

∑ i = 0 n m ( g i + 1 ) ∗ A i \sum\limits_{i=0}^{nm}(g_i+1)*A_i i=0nm(gi+1)Ai

其中 A i A_i Ai代表有 g i g_i gi个好格子的方案数


拆开式子得到 ∑ i = 0 n m g i ∗ A i + ∑ i = 0 n m A i \sum\limits_{i=0}^{nm}g_i*A_i+\sum\limits_{i=0}^{nm}A_i i=0nmgiAi+i=0nmAi

后一项明显是所有的方案数,为 k n m k^{nm} knm

前一项不好解,单独考虑每个格子的贡献

∑ i = 0 n m g i ∗ A i \sum\limits_{i=0}^{nm}g_i*A_i i=0nmgiAi这个式子可以看成,每当一个格子成为好格子,答案加一

所以我们单独考虑每个好格子的方案数累加即可

答案是

n m ∗ ∑ v a l = 2 k ( v a l − 1 ) n + m − 2 ∗ k n ∗ m − n − m + 1 nm*\sum\limits_{val=2}^k(val-1)^{n+m-2}*k^{n*m-n-m+1} nmval=2k(val1)n+m2knmnm+1

首先每个格子都可能成为好格子,方案是 n m nm nm

选了这个格子后,我们枚举这个格子的值 v a l val val

那么这一列这一行需要比 v a l val val小,方案是 ( v a l − 1 ) n + m − 2 (val-1)^{n+m-2} (val1)n+m2

然后其余的格子不受影响,方案数是 k n ∗ m − n − m + 1 k^{n*m-n-m+1} knmnm+1

做完了

总结

做题的时候老是想着枚举几个好格子,但其实明显不可做

转化思维从式子的意义上考虑就好些很多了

#include 
using namespace std;#define int long longconst int mod = 1e9+7;int t,n,m,k,casenum;int quick(int x,int n){
int ans = 1; for( ; n ; n>>=1,x=x*x%mod ) if( n&1 ) ans = ans*x%mod; return ans;}signed main(){
cin >> t; while( t-- ) {
cin >> n >> m >> k; int ans1 = quick(k,n*m), ans2 = 0; for(int i=2;i<=k;i++) ans2 = ( ans2+quick(i-1,n+m-2)*quick(k,n*m-n-m+1)%mod )%mod; int ans = (( ans1+ans2*n%mod*m%mod )%mod+mod)%mod; cout << "Case #" << ++casenum << ": "; cout << ans << endl; }}

转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/116045061 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:gym/101194 E. Bet(贪心,精度)
下一篇:2016-2017 ACM-ICPC CHINA-Final C.Mr. Panda and Strips(dp预处理+暴力)

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月27日 10时27分42秒