結果
問題 | No.1330 Multiply or Divide |
ユーザー |
![]() |
提出日時 | 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 |
ソースコード
#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) /*nのk 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.14159265359const 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^38using 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*dfor(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 int128signed 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*qのときコストk+1回で×qできる//1<=k<=log(max{A})なのでk<=[9*log(2,10)]=29より//コストは1~30//全てのqが1のとき例外として"-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;}}}