結果
問題 | No.864 四方演算 |
ユーザー |
![]() |
提出日時 | 2019-08-19 12:21:54 |
言語 | C++11 (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 15 ms / 1,000 ms |
コード長 | 3,660 bytes |
コンパイル時間 | 681 ms |
コンパイル使用メモリ | 72,084 KB |
実行使用メモリ | 7,936 KB |
最終ジャッジ日時 | 2024-10-03 04:05:25 |
合計ジャッジ時間 | 1,903 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 27 |
ソースコード
#include<iostream>#include<algorithm>#include<vector>#include<queue>#include<stack>#include<list>#include<set>#include<string>using namespace std;int gcd(int a, int b) {int c = a % b;while (c != 0) {a = b;b = c;c = a % b;}return b;}struct UnionFind {vector<int> par; // par[i]:iの親の番号 (例) par[3] = 2 : 3の親が2UnionFind(int N) : par(N) { //最初は全てが根であるとして初期化for (int i = 0; i < N; i++) par[i] = i;}int root(int x) { // データxが属する木の根を再帰で得る:root(x) = {xの木の根}if (par[x] == x) return x;return par[x] = root(par[x]);}void unite(int x, int y) { // xとyの木を併合int rx = root(x); //xの根をrxint ry = root(y); //yの根をryif (rx == ry) return; //xとyの根が同じ(=同じ木にある)時はそのままpar[rx] = ry; //xとyの根が同じでない(=同じ木にない)時:xの根rxをyの根ryにつける}bool same(int x, int y) { // 2つのデータx, yが属する木が同じならtrueを返すint rx = root(x);int ry = root(y);return rx == ry;}};typedef long long ll;ll M = 1000000007;vector<ll> fac(300001); //n!(mod M)vector<ll> ifac(300001); //k!^{M-2} (mod M)ll mpow(ll x, ll n) {ll ans = 1;while (n != 0) {if (n & 1) ans = ans * x % M;x = x * x % M;n = n >> 1;}return ans;}void setcomb() {fac[0] = 1;ifac[0] = 1;for (ll i = 0; i < 1000000; i++) {fac[i + 1] = fac[i] * (i + 1) % M; // n!(mod M)}ifac[1000000] = mpow(fac[1000000], M - 2);for (ll i = 1000000; i > 0; i--) {ifac[i - 1] = ifac[i] * i%M;}}ll comb(ll a, ll b) {if (a == 0 && b == 0)return 1;if (a < b || a < 0)return 0;ll tmp = ifac[a - b] * ifac[b] % M;return tmp * fac[a] % M;}ll perm(ll a, ll b) {if (a == 0 && b == 0)return 1;if (a < b || a < 0)return 0;return fac[a] * ifac[a - b] % M;}// mod. m での a の逆元 a^{-1} を計算するlong long modinv(long long a) {long long b = M, u = 1, v = 0;while (b) {long long t = a / b;a -= t * b; swap(a, b);u -= t * v; swap(u, v);}u %= M;if (u < 0) u += M;return u;}vector<vector<ll>> mul(vector<vector<ll>> a, vector<vector<ll>> b, int n) {int i, j, k, t;vector<vector<ll>> c(n);for (i = 0; i < n; i++) {for (j = 0; j < n; j++) {t = 0;for (k = 0; k < n; k++)t = (t + a[i][k] * b[k][j] % M) % M;c[i].push_back(t);}}return c;}template< typename Monoid >struct SegmentTree {int sz;vector< Monoid > seg;const Monoid M1;SegmentTree(int n, const Monoid &M1) : M1(M1) {sz = 1;while (sz < n) sz <<= 1;seg.assign(2 * sz, M1);}void set(int k, const Monoid &x) {seg[k + sz] = x;}void build() {for (int k = sz - 1; k > 0; k--) {seg[k] = f(seg[2 * k + 0], seg[2 * k + 1]);}}void update(int k, const Monoid &x) {k += sz;seg[k] = x;while (k >>= 1) {seg[k] = f(seg[2 * k + 0], seg[2 * k + 1]);}}Monoid query(int a, int b) {Monoid L = M1, R = M1;for (a += sz, b += sz; a < b; a >>= 1, b >>= 1) {if (a & 1) L = f(L, seg[a++]);if (b & 1) R = f(seg[--b], R);}return f(L, R);}Monoid value(const int &k) const {return seg[k + sz];}Monoid f(Monoid a, Monoid b) {return a + b;}};int main() {ll n, k, i,ans=0,p,q,t,mi,ma,one=1,zero=0;cin >> n >> k;for (i = 2; i*i <= k; i++) {if (k%i == 0) {mi = max(one, i - n);ma = min(n, i - 1);p = max(zero, ma - mi + 1);mi = max(one, k/i - n);ma = min(n, k/i - 1);q = max(zero, ma - mi + 1);t = p * q;if (i*i != k)t *= 2;ans += t;}}cout << ans << endl;}