結果
問題 | No.1141 田グリッド |
ユーザー |
![]() |
提出日時 | 2020-07-31 21:54:18 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 62 ms / 2,000 ms |
コード長 | 3,776 bytes |
コンパイル時間 | 1,222 ms |
コンパイル使用メモリ | 104,232 KB |
実行使用メモリ | 6,912 KB |
最終ジャッジ日時 | 2024-07-06 17:49:33 |
合計ジャッジ時間 | 3,612 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 31 |
ソースコード
#include <iostream>#include <string>#include <cstdlib>#include <cmath>#include <vector>#include <unordered_map>#include <map>#include <set>#include <algorithm>#include <queue>#include <stack>#include <functional>#include <bitset>#include <assert.h>#include <unordered_map>#include <fstream>#include <ctime>using namespace std;typedef long long ll;typedef vector<ll> vl;typedef vector<vl> vvl;typedef vector<char> vc;typedef vector<string> vs;typedef vector<bool> vb;typedef vector<double> vd;typedef pair<ll,ll> P;typedef pair<int,int> pii;typedef vector<P> vpl;typedef tuple<ll,ll,ll> tapu;#define rep(i,n) for(int i=0; i<(n); i++)#define REP(i,a,b) for(int i=(a); i<(b); i++)#define all(x) (x).begin(), (x).end()#define rall(x) (x).rbegin(), (x).rend()const int inf = 1<<30;const ll linf = 1LL<<62;const int MAX = 510000;ll dy[8] = {1,-1,0,0,1,-1,1,-1};ll dx[8] = {0,0,1,-1,1,-1,-1,1};const double pi = acos(-1);const double eps = 1e-7;template<typename T1,typename T2> inline bool chmin(T1 &a,T2 b){if(a>b){a = b; return true;}else return false;}template<typename T1,typename T2> inline bool chmax(T1 &a,T2 b){if(a<b){a = b; return true;}else return false;}template<typename T> inline void print(T &a){rep(i,a.size()) cout << a[i] << " ";cout << "\n";}template<typename T1,typename T2> inline void print2(T1 a, T2 b){cout << a << " " << b << "\n";}template<typename T1,typename T2,typename T3> inline void print3(T1 a, T2 b, T3 c){cout << a << " " << b << " " << c << "\n";}ll pcount(ll x) {return __builtin_popcountll(x);}const int mod = 1e9 + 7;//const int mod = 998244353;template <std::uint_fast64_t Modulus> class modint {using u64 = std::uint_fast64_t;public:u64 a;constexpr modint(const u64 x = 0) noexcept : a(x % Modulus) {}constexpr u64 &value() noexcept { return a; }constexpr const u64 &value() const noexcept { return a; }constexpr modint operator+(const modint rhs) const noexcept {return modint(*this) += rhs;}constexpr modint operator-(const modint rhs) const noexcept {return modint(*this) -= rhs;}constexpr modint operator*(const modint rhs) const noexcept {return modint(*this) *= rhs;}constexpr modint operator/(const modint rhs) const noexcept {return modint(*this) /= rhs;}constexpr modint &operator+=(const modint rhs) noexcept {a += rhs.a;if (a >= Modulus) {a -= Modulus;}return *this;}constexpr modint &operator-=(const modint rhs) noexcept {if (a < rhs.a) {a += Modulus;}a -= rhs.a;return *this;}constexpr modint &operator*=(const modint rhs) noexcept {a = a * rhs.a % Modulus;return *this;}constexpr modint &operator/=(modint rhs) noexcept {u64 exp = Modulus - 2;while (exp) {if (exp % 2) {*this *= rhs;}rhs *= rhs;exp /= 2;}return *this;}};using mint = modint<mod>;int main(){ll h,w; cin >> h >> w;vvl a(h,vl(w));rep(i,h) rep(j,w) cin >> a[i][j];mint acc = 1;vector<mint> b(h), c(w);ll zero = 0;vl zh(h), zw(w);rep(i,h){mint t = 1;rep(j,w){if(a[i][j] == 0){zero++, zh[i]++;continue;}t *= a[i][j];acc *= a[i][j];}b[i] = t;}rep(j,w){mint t = 1;rep(i,h){if(a[i][j] == 0){zw[j]++;continue;}t *= a[i][j];}c[j] = t;}ll q; cin >> q;ll memo = 0;while(q--){int R,C; scanf("%d%d",&R,&C); R--; C--;if(zero){if(zh[R] + zw[C] - (a[R][C] == 0) == zero){mint waru = b[R] * c[C];mint ans = acc / waru;if(a[R][C] != 0) ans *= a[R][C];cout << ans.value() << "\n";}else{cout << 0 << "\n";}}else{mint waru = b[R] * c[C];mint ans = acc / waru * a[R][C];cout << ans.value() << "\n";}}}