列表

详情


NC219016. 贪吃蛇

描述

牛牛在玩贪吃蛇,玩贪吃蛇吃掉别的蛇就会变长。牛牛的蛇被别人吃掉后,发现可以看广告复活,且复活后长度不变。
牛牛想到了一个作弊的高招,他和他邀请的个朋友进入同一个房间玩贪吃蛇,初始时一共有条蛇,第条蛇的长度为L_i,进入游戏后,首先牛牛从这条蛇中选择一条蛇作为自己的蛇,然后他的第个朋友从剩下的条蛇中选择一条蛇,然后他的第个朋友从剩下的条蛇中选择一条蛇... ...直到牛牛的第个朋友选择蛇后,游戏开始,现在他们互相吃掉对方。
设蛇此时的长度L_A,蛇此时的长度L_B,蛇吃掉蛇长度会变为,而蛇则需要看秒广告复活。
牛牛的朋友都会帮助牛牛使牛牛的蛇变得尽可能的长,牛牛想知道,秒后牛牛的蛇最长可以是多长?
(假设吃蛇不花时间,可以无限次复活,除了吃蛇没有其它方式可以变长,房间里除了牛牛和牛牛的朋友外没有别人)
由于答案可能很大,你只需要输出答案对取模的结果。

输入描述

输入包含组测试用例,第一行一个整数
每组测试用例第一行三个整数
每组测试用例第二行个整数

输出描述

输出行,第行为第组测试用例的答案。

示例1

输入:

3
1 3 4
2
5 7 8
6 6 6 6 6
5 1 8
6 6 6 6 6

输出:

2
90
612546

原站题解

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

pypy3 解法, 执行用时: 1867ms, 内存消耗: 31288K, 提交时间: 2021-08-20 23:34:41

M = 1000000007
def mul(a,b):
    ret = [[0 for i in range(len(b[0]))] for i in range(len(a))]
    for i in range(len(a)):
        for k in range(len(a[0])):
            for j in range(len(b[0])):
                ret[i][j] += a[i][k]*b[k][j]
                ret[i][j] %= M
    return ret
def getL(n):
    return [[int(i>=j) for j in range(n)] for i in range(n)]
def getU(n):
    return [[int(i<=j) for j in range(n)] for i in range(n)]

def pr(x):
    print('[')
    for l in x:
        print(l,',')
    print(']')
def powM(x, t):
    ret = [[int(i==j) for j in range(len(x))] for i in range(len(x))]
    while t:
        if(t%2 == 1): ret = mul(ret, x);
        t>>=1
        x = mul(x,x)
    return ret
def sum_(x):
    ret = 0
    for v in x:
        ret += sum(v)
        ret %= M
    return ret
gt =lambda: list(map(int, input().split()))
t ,= gt()
while t:
    t -= 1
    n,x,m = gt()
    ar = gt()
    ar.sort()
    rnd = m//x
    tmp = mul(getL(n),getU(n))
    ansM = mul([ar], powM(tmp,rnd//2))
    if(rnd%2 == 1):
        ansM = mul(ansM, getL(n))
    print(sum_(ansM))

C++ 解法, 执行用时: 739ms, 内存消耗: 488K, 提交时间: 2021-10-20 16:42:49

#include <bits/stdc++.h>
using namespace std;
const int N=55,p=1e9+7;
int t,n,x,m;
int a[N][N],b[N][N],res[N][N];
void mul(int c[][N],int a[][N],int b[][N]){
	int t[N][N];memset(t,0,sizeof t);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			for(int k=1;k<=n;k++){
				t[i][j]=1ll*(t[i][j]+1ll*a[i][k]*b[k][j]%p)%p;
			}
		}
	}
	memcpy(c,t,sizeof t);
}
signed main()
{
	cin>>t;
	while(t--){
		memset(a,0,sizeof a);
		memset(b,0,sizeof b);
		memset(res,0,sizeof res);
		cin>>n>>x>>m;
		x=m/x+1;
		for(int i=1;i<=n;i++) cin>>a[1][i];
        sort(a[1]+1,a[1]+1+n);
		for(int i=1;i<=n;i++){
			for(int j=n;j>n-i;j--){
				b[i][j]=1;
			}
		}
		while(x){
			if(x&1) mul(a,a,b);
			mul(b,b,b);
			x>>=1;
		}
		cout<<a[1][n]<<'\n';
	}
}

上一题