#include #include template constexpr inline T mod(T a,T m){ a %= m; return (a<0?a+m:a); } template std::tuple ext_gcd(T a,T b){ if(b==0){ return {a,1,0}; } auto [d,y,x] = ext_gcd(b,a%b); y -= a/b * x; return {d,x,y}; } template T mod_inv(T a,T m){ auto[d,x,y] = ext_gcd(a,m); return (d!=1?-1:mod(x,m)); } #include #include template T gerner(std::vector const& b,std::vector const& m){ assert(0 b,std::vector m,int64_t const MOD){ using i64 = int64_t; assert(0 coeffs(std::size(m),1); std::vector constants(std::size(m),0); for(int k=0;k int64_t operator"" _i64(unsigned long long x){ return (int64_t)x; } void solve_yuki_187(){ using namespace std; using i64 = int64_t; constexpr i64 MOD = 1e9+7; int n; cin>>n; vector x(n),y(n); for(int i=0;i>x[i]>>y[i]; i64 sum = accumulate(begin(x),end(x),0_i64,[](i64 acc,i64 xi){return acc+xi;}); // A % y[i] = x[i], A \equiv x[i] (mod. y[i]) { // 対ごとに素にする // m0 = 2**p0 + 3**p1 + 5**p2 + 7**p3 // m1 = 2**q0 + 3**q1 + 5**q2 + 7**q3 // のように具体的に値を割り振って計算すると指数の大きいほうが残って小さいほうが0になるのがわかる for(int i=0;i+1 pairwise_coprime = {7,11,13,16,17,19,23,25,27,29}; auto contain = [&pairwise_coprime](int b_1){return binary_search(begin(pairwise_coprime),end(pairwise_coprime),b_1);}; vector a(31),r,m=pairwise_coprime; for(int b=2;b<=30;++b){ cin>>a[b]; if(contain(b-1)) r.emplace_back(a[b]%(b-1)); } i64 ans = gerner(r,m); if(ans==25)exit(1); auto invalid = [](){ cout<<"invalid"<1e12)invalid(); for(int b=2;b<=30;++b) if(a[b] != digit_sum(ans,b)) invalid(); cout<