結果
| 問題 |
No.187 中華風 (Hard)
|
| コンテスト | |
| ユーザー |
Sugina_Miku_
|
| 提出日時 | 2018-11-26 03:36:27 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 6,749 bytes |
| コンパイル時間 | 2,181 ms |
| コンパイル使用メモリ | 173,424 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-12-26 00:28:25 |
| 合計ジャッジ時間 | 5,995 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 24 WA * 1 |
ソースコード
#include <bits/stdc++.h>
#include <iomanip>
//#define DEBUG 0
using namespace std;
typedef long long LL;
typedef long double LD;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
typedef pair<LD, LD> PLDLD;
typedef vector<int> VI;
typedef vector<LL> VLL;
typedef vector<char> VB;
#define FOR(i,a,b) for(int i=(a);i<(int)(b);++i)
#define REP(i,n) FOR(i,0,n)
#define CLR(a) memset((a), 0 ,sizeof(a))
#define ALL(a) a.begin(),a.end()
#define UNQ(a) a.erase(std::unique(ALL(a)),a.end());
#define endl "\n"
const LD EPS=1e-10;
const long long INFLL=(LL)(1e9)*(LL)(1e9);
const int INF=1e9+7;
template<class T>
void chmin(T& a, const T b)
{
if(a>b)
a=b;
}
template<class T>
void chmax(T& a, const T b)
{
if(a<b)
a=b;
}
const LL powLL(const LL p, const LL q)
{
LL t=1;
for(int i=0;i<q;i++)
t*=p;
return t;
}
template <typename T>
struct has_iter
{
private:
template <typename U>
static constexpr true_type check(typename U::iterator*);
template <typename U>
static constexpr false_type check(...);
public:
static constexpr bool value = decltype(check<T>(nullptr))::value;
};
template<typename T, typename U = typename T::iterator>
void print(const T& container)
{
auto&& first=begin(container), last=end(container);
auto&& back=prev(last);
for(auto e=first; e!=last; e=next(e))
cout<<*e<<" \n"[e==back];
}
extern void* enabler;
template<typename Head, typename enable_if<!has_iter<Head>::value>::type*& = enabler>
void print(const Head& head)
{
cout<<head<<endl;
}
template<> void print<string>(const string& container)
{
cout<<container<<endl;
}
template<typename Head, typename... Tail>
void print(const Head& head, const Tail&... tail)
{
cout<<head<<" ";
print(tail...);
}
template<typename... Args>
void printd(const Args&... args)
{
#ifdef DEBUG
print(args...);
#endif
}
template<typename Head>
void input(Head& head)
{
cin>>head;
}
template<typename Head, typename... Tail>
void input(Head& head, Tail&... tail)
{
cin>>head;
input(tail...);
}
void io_speedup()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
}
template<typename T>
istream& operator >> (istream& is, vector<T>& vec)
{
for(T& x: vec) is >> x;
return is;
}
template<typename T, typename U>
istream& operator >> (istream& is, pair<T, U>& t)
{
is>>t.first>>t.second;
return is;
}
template<int N, typename... Ts, typename enable_if<N == sizeof...(Ts)-1>::type*& = enabler>
void tuple_in(istream &is, tuple<Ts...> &t)
{
is>>get<N>(t);
}
template<int N, typename... Ts, typename enable_if<N < sizeof...(Ts)-1>::type*& = enabler>
void tuple_in(istream &is, tuple<Ts...> &t)
{
is>>get<N>(t);
tuple_in<N+1, Ts...>(is, t);
}
template<typename... Ts>
istream& operator >> (istream& is, tuple<Ts...>& t)
{
tuple_in<0, Ts...>(is, t);
return is;
}
template<typename T, typename U>
ostream& operator << (ostream& os, const pair<T, U>& t)
{
os<<'('<<t.first<<", "<<t.second<<')';
return os;
}
template<int N, typename... Ts, typename enable_if<N == sizeof...(Ts)-1>::type*& = enabler>
void tuple_out(ostream &os,const tuple<Ts...> &t)
{
os<<get<N>(t);
}
template<int N, typename... Ts, typename enable_if<N < sizeof...(Ts)-1>::type*& = enabler>
void tuple_out(ostream &os,const tuple<Ts...> &t)
{
os<<get<N>(t)<<", ";
tuple_out<N+1, Ts...>(os, t);
}
template<typename... Ts>
ostream& operator << (ostream& os, const tuple<Ts...>& t)
{
os<<'(';
tuple_out<0, Ts...>(os, t);
os<<')';
return os;
}
template<typename T>
vector<T> read(int n)
{
vector<T> t(n);
cin>>t;
return t;
}
template<typename T>
T read()
{
T t;
cin>>t;
return t;
}
template<typename Head, typename... Tail>
struct vector_demensions
{
using type=vector<typename vector_demensions<Tail...>::type>;
};
template<typename Head>
struct vector_demensions<Head> { using type=Head; };
template<typename T>
vector<T> make_vectors(int size, T val)
{
return vector<T>(size, val);
}
template<typename T=int, typename... Args>
auto make_vectors(int size, Args... tail)
-> typename vector_demensions<Args..., T>::type
{
auto val=make_vectors<T>(forward<Args>(tail)...);
return vector<decltype(val)>(size, val);
}
namespace Garner
{
/* Garnerのアルゴリズム
x = mods[i].first mod mods[i].second を満たすxを求める
https://qiita.com/drken/items/ae02240cd1f8edfc86fd
*/
using LL = long long;
LL gcd(const LL a, const LL b)
{
return __gcd(a, b);
}
LL mod(const LL p, const LL m)
{
return (p<0)?(p%m+m):(p%m);
}
LL extgcd(const LL a, const LL b, LL &x, LL &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
LL d=extgcd(b, a%b, y, x);
y-=a/b*x;
return d;
}
LL modinv(const LL a, const LL m)
{
//a*x + m*y = gcd(a,m) = 1
LL x,y;
extgcd(a, m, x, y);
return mod(x, m);
}
/*
Garnerの前処理
modが互いに素になるようにするor解が無いときは-1を返す
*/
vector<pair<LL,LL>> normalize(const vector<pair<LL, LL>> &mods)
{
vector<pair<LL, LL>> ret(mods);
for(size_t i=0;i<ret.size();i++)
for(size_t j=0;j<i;j++)
{
LL g=gcd(ret[i].second, ret[j].second);
if((ret[i].first - ret[j].first)%g != 0) return vector<pair<LL, LL>>(0);
ret[i].second/=g;
ret[j].second/=g;
LL gi = gcd(ret[i].second, g);
LL gj = g/gi;
g = gcd(gi, gj);
while(g != 1)
{
gi*=g;
gj/=g;
g = gcd(gi, gj);
}
ret[i].second*=gi;
ret[j].second*=gj;
ret[i].first%=ret[i].second;
ret[j].first%=ret[j].second;
}
return ret;
}
LL Garner(const vector<pair<LL, LL>> &mods, const LL m)
{
const int n=mods.size();
vector<LL> modprod(n+1,1);
vector<LL> p(n+1);
for(int i=0;i<n;i++)
{
LL t=mod((mods[i].first - p[i]) * modinv(modprod[i], mods[i].second), mods[i].second);
for(int j=i+1;j<n;j++)
{
p[j]+=t*modprod[j];
p[j]%=mods[j].second;
modprod[j]*=mods[i].second;
modprod[j]%=mods[j].second;
}
p[n]+=t*modprod[n];
p[n]%=m;
modprod[n]*=mods[i].second;
modprod[n]%=m;
}
return p[n];
}
LL solve(const vector<pair<LL, LL>> &mods, const LL m)
{
const vector<pair<LL,LL>> tmp(normalize(mods));
if(tmp.size() == 0) return -1;
return Garner(tmp, m);
}
}
int main()
{
int n;
cin>>n;
vector<PLL> x(n);
REP(i,n)
input(x[i].first, x[i].second);
auto tmp=Garner::normalize(x);
if(tmp.size()==0)
{
print(-1);return 0;
}
LL ans=Garner::Garner(tmp, INF);
if(ans==0)
{
LL ans=1;
for(auto&& e:tmp)
(ans*=e.second)%=INF;
print(ans);
}
else print(ans);
}
Sugina_Miku_