列表

详情


NC25521. 乐色王传奇

描述

X相中了N个乐色桶,每个桶中都有N个乐色。第i个乐色桶里第j个乐色有一个臭度
X会从每个乐色桶里随机掏出一个乐色。由于X非常喜欢臭乐色,所以他会挑出最臭的那个闻一闻。
他想问你:他这么搞,闻到的臭度的期望值是多少?
因为这个数字可能很怪,所以你需要输出。

输入描述

第一行一个整数N
接下来N行,每行N个整数,第i行的第j个表示

输出描述

一行一个整数,表示结果

示例1

输入:

2
2 1
1 2

输出:

750000007

说明:

经过计算可得,选出来两个乐色,最大臭度为2的可能性为75 \%,最大臭度为1的可能性为25 \%
故期望值为\frac{3}{4} \times 2 + \frac{1}{4} \times 1 = \frac{7}{4} \equiv 750000007 \ ( \mod \ 1000000007 \ )

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 2870ms, 内存消耗: 102520K, 提交时间: 2019-05-21 00:06:32

#include <bits/stdc++.h>
#define mp make_pair
#define pii pair<int,int>
using namespace std;
typedef long long ll;
#define rint register int
const int maxn=6250007;
const int inf=(1LL<<29);
const int mod=1e9+7;
struct node{
    int x,p;
    bool operator < (node a) const{
        if(x!=a.x) return x<a.x;
        return p<a.p;
    }
}q[maxn];
int pown(int a,int b){
    int ans=1;
    while(b){
        if(b&1) ans=(1LL*ans*a)%mod;
        a=(1LL*a*a)%mod;
        b>>=1;
    }
    return ans;
}
void add(int &x,int y){
    x+=y;if(x>mod) x-=mod;
}
int now[maxn],ans=1,cnt;
int main(){
    cin.tie(0);ios_base::sync_with_stdio(false);
    int n;cin>>n;
    for(int i=1;i<=n;i++)
    for(int k=1;k<=n;k++){
        int x;cin>>x;
        q[(i-1)*n+k]={x,i};
    }
    sort(q+1,q+n*n+1);
    int tot=0;
    for(int i=1;i<=n*n;i++){
        node& a=q[i];
        if(now[a.p])ans=(1LL*ans*pown(now[a.p],mod-2))%mod;
        else cnt++;
        if(cnt==n) add(tot,(1LL*ans*a.x)%mod);
        now[a.p]++;
        ans=(1LL*ans*now[a.p])%mod;
    }
    cout<<1LL*tot*pown(pown(n,n),mod-2)%mod;
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 2307ms, 内存消耗: 49272K, 提交时间: 2020-07-26 13:19:35

#include<bits/stdc++.h>
using namespace std;

struct node
{
	int x,id;
}R[6250005];
bool cmp(node a,node b)
{
	return a.x>b.x;
}
const int mod=1e9+7;
long long fastpow(long long a,int b)
{
	long long s=1;
	for(;b;b>>=1,a=a*a%mod)if(b&1)s=s*a%mod;
	return s;
}
int main()
{
    int i,j,x,id=0,n,ans=0,T[2505];
    long long s=1;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)scanf("%d",&R[id].x),R[id++].id=i;
    sort(R,R+n*n,cmp);
    for(i=0;i<n;i++)T[i]=n,s=s*n%mod;
    for(i=0;i<n*n;i++)
    {
    	id=R[i].id,x=R[i].x;
		s=s*fastpow(T[id],mod-2)%mod;
		ans=(ans+s*x%mod)%mod;
		s=s*(--T[id])%mod;
	}
	printf("%d\n",ans*fastpow(fastpow(n,n),mod-2)%mod);
    return 0;
}

上一题