列表

详情


NC204779. 多重序列

描述

给出n个组,第i组有m个数,分别为,一组数的权值表示为该组数所有数的乘积,找出权值最大的组,输出权值对mod取模后的值

对于每组数据给出一个k,保证是k的非负整数次幂

输入描述

第一行4个数n,m,k,mod,意义见题目描述
接下来n行,每行m个数,第i行第j个数表示

输出描述

一个数,表示最大的权值对mod取模的结果

示例1

输入:

3 3 2 100
2 8 4
16 4 1
8 1 32

输出:

56

说明:

三组权值分别为64,64,256,最大值为256

原站题解

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

C++14(g++5.4) 解法, 执行用时: 1291ms, 内存消耗: 27544K, 提交时间: 2020-07-09 14:00:16

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,m,k,s=0,i,j;long long int mod;
    scanf("%d%d%d%lld",&n,&m,&k,&mod);
    for(i=1;i<=n;i++){
        int t=0;
        long long x;
        for(j=1;j<=m;j++){
            scanf("%lld",&x);
            while(x>1)x/=k,++t;
        }
        s=max(s,t);
    }
    long long int ans=1;
    for(i=1;i<=s;i++)
        ans*=k,ans%=mod;
    printf("%lld",ans);
    return 0;
}

pypy2(pypy2.7.13) 解法, 执行用时: 3044ms, 内存消耗: 27968K, 提交时间: 2020-06-12 19:53:03

def fpow(x,k,MOD):
	ans = 1
	while k != 0:
		if (k&1)==1:
			ans = ans*x % MOD
		k=k>>1
		x=x*x%MOD
	return ans

def get(val,k):
	cnt = 0
	if val==1:
		return 0
	while val%k==0:
		cnt = cnt + 1
		val /= k
	return cnt

n,m,k,mod = map(int,raw_input().split())
mx = 0 
for i in range(n):
	s = 0
	l = map(int,raw_input().split())
	for val in l:
		s += get(val,k)
	if s > mx:
		mx = s
if k==1:
	print(1)
else:
	print(fpow(k,mx,mod))
 	

C++11(clang++ 3.9) 解法, 执行用时: 1180ms, 内存消耗: 608K, 提交时间: 2020-06-12 21:41:40

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
	ll n,m,k,mod;
	scanf("%lld %lld %lld %lld",&n,&m,&k,&mod);
	ll a[2005],b=0,maxn=0,ans=1;
	for(ll i=0;i<n;i++){
		b=0;
		for(ll j=0;j<m;j++){
			scanf("%lld",&a[j]);
			b=b+(log(a[j])/log(k));
		}
		if(maxn<b)  maxn=b;
	}
	for(int i=1;i<=maxn;i++){
		ans=(ans*k)%mod;
	}
	printf("%lld\n",ans);
	return 0;
}

Python3(3.5.2) 解法, 执行用时: 2908ms, 内存消耗: 156488K, 提交时间: 2020-06-16 15:21:10

import math
n,m,k,mod=map(int,input().split())
arr=[list(map(int,input().split())) for i in range(n)]
maxi=0
maxvalue=0
for i in range(n) :
    tmpvalue=0
    for j in range(m) :
        tmpvalue+=math.log2(arr[i][j])
    if tmpvalue> maxvalue :
        maxi=i
        maxvalue=tmpvalue
# print(maxi,maxvalue)
res=1
for i in range(m) :
    res=(res*arr[maxi][i]) % mod

print(res)

上一题