题目:
给出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;
}