NC204779. 多重序列
描述
输入描述
第一行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,最大值为256C++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)