2.18比賽(T2,T3留坑)

2.18比賽(T2,T3留坑)html

pdf版題面c++

pdf版題解git

 超越一切(ak) github

【題目描述】 web

夏洛可獲得一個(h+1)×(w+1)的巧克力,這意味着她橫着最多可 以切 h 刀,豎着最多能夠切 w 刀 她想總共切 k 刀,每刀要麼豎着切要麼橫着切,若是豎着切了 i 刀,橫着切了 j 刀,會獲得(i+1) ×(j+1)個巧克力,定義一個切 k 刀 的方案的代價是每一刀切完後巧克力個數之和,假設每刀切的位置是 隨機選擇的(即剩餘能切的位置等機率隨機選一個),請你求出指望 代價,對109+7 取模 ide

【輸入格式】測試

一行三個正整數 h,w,k spa

【輸出格式】3d

一行一個整數表示答案 code

【樣例 1 輸入】

2 1 2

【樣例 1 輸出】

666666677

【數據範圍】

本題有 6 個子任務,每一個子任務只有 1 個測試點

對於 100%的數據,知足 h,w≤ 1018,k≤h+w

Subtask 1[10 pts]: h,w≤300

Subtask 2[10 pts]:h,w≤5000

Subtask 3[30 pts]:h,w≤106

Subtask 4[25 pts]:k≤107

Subtask 5[15 pts]:k=h+w

Subtask 6[10 pts]:無特殊限制 選手文件夾下的額外樣例和最終數據範圍相同

 

sol:題解寫的很是好(大霧)

 

稍微解釋一下,對於每個矩形,只對它左下角的那個點記錄貢獻

記錄的是中間的點的貢獻,就是不在邊界上的點,這樣的點共有h*w個,每一個點切中的機率就是前面那個式子

而後由於這是每一個點的指望,統計答案時要乘以h*w

還有邊上的點,對於最最左下角的點,k刀中每次切都會有1的貢獻,因此ans+k

還有不在左下角的點,每次切都會新產生一個會形成貢獻的點,ans+=(1+k)*k/2

標算已經在上面了,在貼一遍沒什麼意思,放一份較易理解的75pts的暴力好了

 

 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{
    ll s=0;
    bool f=0;
    char ch=' ';
    while(!isdigit(ch))
    {
        f|=(ch=='-'); ch=getchar();
    }
    while(isdigit(ch))
    {
        s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
    }
    return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
    if(x<0)
    {
        putchar('-'); x=-x;
    }
    if(x<10)
    {
        putchar(x+'0');    return;
    }
    write(x/10);
    putchar((x%10)+'0');
    return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const ll Mod=1000000007;
const ll N=20000005;
ll h,w,k;
ll Jiec[N],Niy[N];
inline void Ad(ll &x,ll y)
{
    x+=y;
    x-=(x>=Mod)?(Mod):0;
    return;
}
inline ll Ksm(ll x,ll y)
{
    ll ans=1ll;
    while(y)
    {
        if(y&1) ans=ans*x%Mod;
        x=x*x%Mod;
        y>>=1;
    }
    return ans%Mod;
}
inline ll C(ll n,ll m)
{
    if(!Niy[m]) Niy[m]=Ksm(Jiec[m],Mod-2)%Mod;
    if(!Niy[n-m]) Niy[n-m]=Ksm(Jiec[n-m],Mod-2)%Mod;
    return Jiec[n]*Niy[m]%Mod*Niy[n-m]%Mod;
}
int main()
{
    freopen("ak.in","r",stdin);
    freopen("ak.out","w",stdout);
    ll i;
    R(h); R(w); R(k);
    Jiec[0]=1ll;
    for(i=1;i<=h+w;i++)
    {
        Jiec[i]=Jiec[i-1]*i%Mod;
    }
    ll ans=0;
    ll NN=Ksm(C(h+w,2ll),Mod-2)%Mod;
    Ad(ans,C(k + 1,3ll)*NN%Mod);
    ans=ans*(h*w%Mod)%Mod;
    Ad(ans,(((1+k)*k)>>1)%Mod);
    Ad(ans,k);
    Wl(ans);
    return 0;
}
/*
input
1 2
output
*/
75pts暴力

 

附上ak王pfy的題解

相關文章
相關標籤/搜索