1. 程式人生 > 實用技巧 >AtCoder Beginner Contest 173E Multiplication 4(思維)

AtCoder Beginner Contest 173E Multiplication 4(思維)

題意:給出長度為n的序列a,選出k個數字使得連乘積最大,輸出取模mod。n<2e5,a[i]<1e9

題解:從小到大排序,k為奇數先取一個最大的,之後就是比較開頭兩個的乘積和結尾兩個乘積的大小,注意當k為奇數的時候,且a全部為負數的時候分開討論一下,還有就是需要先取模再乘積,會爆long long

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define fre freopen("C:\\in.txt", "r", stdin)
#define _for(i,a,b) for(int i=a; i< b; i++)
#define
_rep(i,a,b) for(int i=a; i<=b; i++) #define lowbit(a) ((a)&-(a)) #define inf 0x3f3f3f3f #define endl "\n" using namespace std; typedef long long ll; template <class T> void read(T &x) { char c; bool op=0; while(c=getchar(), c<'0'||c>'9') if(c=='-') op=1; x=c-'0';
while(c=getchar(), c>='0'&&c<='9') x=x*10+c-'0'; if(op) x=-x; } const int mod=1e9+7; int main() { int n, k; read(n), read(k); vector<ll> a(n); for(auto &val: a) read(val); sort(a.begin(), a.end()); ll ans=1; int ok=0; if(k%2) ans*=a[--n], k--;
if(ans<0) ok=1; int l=0, r=n-1; while(k){ ll x=a[r]*a[r-1], y=a[l]*a[l+1]; if(ok || x>y) ans=x%mod*ans%mod, r-=2; //注意每次取餘,會溢位long long else ans=y%mod*ans%mod, l+=2; //cout<<l<<" "<<r<<" "<<ans<<endl; k-=2; } printf("%lld\n", (ans+mod)%mod); return 0; }