多重序列

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

对于每组数据给出一个k,保证a[i][j]是k的非负整数次幂。

输入:
第一行4个数n,m,k,mod,意义见题目描述
接下来n行,每行m个数,第i行第j个数表示a[i][j];
输出:
一个数,表示最大的权值对mod取模的结果

数据范围:
1≤n,m≤2000,1≤k≤100,1≤a[i][j] ,mod≤10^12

题解:
这是一道刷牛客时候的签到题,就感觉是很有意思的思维

解题的关键就是利用a[i][j]的特殊性,因为它是k的整数次幂,而
(a ^ b) * (a ^ c) = a ^ (b + c);因此只需要存储每组数据的乘积是k的几次幂就好,最后求出最大的次幂,得出结果。

AC代码:

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define ll long long
const int maxn = 2e3 + 15;
int a[maxn];
ll q_pow(ll k, ll x, ll mod) {
	ll res = 1;
	while (x) {
		if (x % 2 == 1)
			x--, res = (res * k) % mod;
		x /= 2;
		k = (k * k) % mod;
	}
	return res;
}
int main()
{
	ll n, m, k, mod;
	cin >> n >> m >> k >> mod;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			ll x; cin >> x;
			a[i] += (log(x) / log(k));
		}
	}
	sort(a, a + n);
	cout << q_pow(k, a[n - 1], mod) << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值