結果

問題 No.1330 Multiply or Divide
ユーザー re_re0101
提出日時 2021-03-20 16:44:29
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 187 ms / 2,000 ms
コード長 5,300 bytes
コンパイル時間 2,088 ms
コンパイル使用メモリ 179,956 KB
実行使用メモリ 9,472 KB
最終ジャッジ日時 2024-11-21 05:10:06
合計ジャッジ時間 4,324 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 46
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#ifndef ONLINE_JUDGE
#define _GLIBCXX_DEBUG
#endif
#include<bits/stdc++.h>
using namespace std;
#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)
#define bit(n,k) (((ll)n>>(ll)k)&1) /*nk bit*/
#define pb push_back
#define pf push_front
#define FI first
#define SE second
#define eb emplace_back
#define endl '\n'
#define SZ(x) ((ll)(x).size())
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define PI 3.14159265359
const double eps = 1e-12;
const long long INF= 1e+18+1;
typedef long long ll;
typedef vector<ll> vl;
typedef vector<vector<ll> >vvl;
typedef vector<vector<vector<ll> > >vvvl;
typedef vector<vector<vector<vector<ll> > > >vvvvl;
typedef vector<vector<vector<vector<vector<ll> > > > >vvvvvl;
typedef pair<ll,ll> P;
typedef tuple<ll,ll,ll> T;
typedef struct Point_Coordinates {
ll x, y;
} point;
template<class T> using minpq=priority_queue<T,vector<T>,greater<T>>;
const ll MOD=1000000007LL;
//ll MOD=1000000007LL;
// const ll MOD=998244353LL;
//const ll MOD=1777777777LL;
//const ll MAX_V=114514LL;
//const ll MAX = 500010LL;
const ll mod=MOD;
string abc="abcdefghijklmnopqrstuvwxyz";
string ABC="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
vl dx={0,0,1,-1,1,1,-1,-1};
vl dy={1,-1,0,0,-1,1,-1,1};
template<class T>bool chmax(T &a,const T &b){if(a<b){a=b;return true;}return false;}
template<class T>bool chmin(T &a,const T &b){if(b<a){a=b;return true;}return false;}
struct IOSetup{
IOSetup(){
cin.tie(0);
ios::sync_with_stdio(0);
cout<<fixed<<setprecision(12);
}
} iosetup;
template<typename T>
ostream &operator<<(ostream &os,const vector<T>&v){
for(int i=0;i<(int)v.size();i++) os<<v[i]<<(i+1==(int)v.size()?"":" ");
return os;
}
template<typename T>
istream &operator>>(istream &is,vector<T>&v){
for(T &x:v)is>>x;
return is;
}
// 2^127 = 170141183460469231731687303715884105728 ~ 10^38
using int128=__int128;
ostream &operator<<(ostream &os,const __int128 n){
if(n==0){
os<<0;
return os;
}
__int128 num=n;
bool neg=false;
if(num<0)neg=true,num=-num;
string res="";
while(num>0){
res.push_back('0'+num%10);
num/=10;
}
if(neg) res.push_back('-');
reverse(begin(res),end(res));
os<<res;
return os;
}
istream &operator>>(istream &is,__int128 &n){
string s;
is>>s;
int idx=0;
bool neg=false;
if(s[0]=='-')neg=true,idx++;
n=0;
for(;idx<(int)s.size();idx++){
n=10*n+s[idx]-'0';
}
if(neg) n=-n;
return is;
}
__int128 abs128(__int128 x){
return x<0?-x:x;
}
__int128 gcd128(__int128 a,__int128 b){
if(a==0) return b;
if(b==0) return a;
return b>0?gcd128(b,a%b):a;
}
namespace fastprime{
int128 pow_mod(int128 a,int128 n,int128 m){
int128 ret=1;
while(n){
if(n&1)ret=ret*a%m;
a=a*a%m;
n>>=1;
}
return ret;
}
bool miller_rabin(int128 n){
if(n<=1) return false;
if(n==2) return true;
if(n%2==0) return false;
int128 d=n-1,s=0;
while(!(d&1))d>>=1,s++;// n-1=2^s*d
for(int128 a:{2,3,5,7,11,13,17,19,23,29,31,37}){
if(n<=a) break;
int128 y=pow_mod(a,d,n);// y=a^d (mod n)
int128 t;
for(t=d;t<n-1 and y!=1 and y!=n-1;t<<=1) y=y*y%n;
if(y!=n-1 and t%2==0) return false;
}
return true;
}
int128 pollard_rho_single(int128 n){
auto f=[&](int128 x){return (x*x+1)%n;};
if(miller_rabin(n)) return n;
if(!(n&1)) return 2;
int128 a=0;
while(true){
a++;
int128 x=a;
int128 y=f(x);
while(true){
int128 g=gcd128(y-x+n,n);
if(g==0 or g==n) break;
if(g!=1) return g;
x=f(x);
y=f(f(y));
}
}
}
vector<int128> pollard_rho(int128 n){
if(n==1) return {};
int128 x=pollard_rho_single(n);
if(x==n) return {x};
vector<int128> l=pollard_rho(x);
vector<int128> r=pollard_rho(n/x);
l.insert(l.end(),r.begin(),r.end());
return l;
}
}
#define ll int128
#define int int128
signed main(){
ll n,m,p;
cin>>n>>m>>p;
vector<ll> a(n);
rep(i,n)cin>>a[i];
ll ma=1;
rep(i,n)chmax(ma,a[i]);
//a[i]=p^k*qk+1×q
//1<=k<=log(max{A})k<=[9*log(2,10)]=29
//1~30
//q1"-1"
if(ma>m){
cout<<1<<endl;
return 0;
}
vector<P>vec(n);
bool one=true;
rep(i,n){
ll cnt=0;
ll now=a[i];
while(now%p==0)now/=p,cnt++;
vec[i]={cnt+1,now};
if(now!=1)one=false;
// cout<<cnt+1<<" "<<now<<endl;
}
if(one){
cout<<-1<<endl;
return 0;
}
ll t=1000;
vector<ll> dp(t,-1);
dp[0]=1;
for(int i=1;i<t;i++){
rep(j,n){
if(vec[j].second==1)continue;
if(i>=vec[j].first)chmax(dp[i],dp[i-vec[j].first]*vec[j].second);
}
// cout<<dp[i]<<" ";
if(dp[i]*ma>m){
cout<<i+1<<endl;
return 0;
}
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0