結果
| 問題 | 
                            No.1200 お菓子配り-3
                             | 
                    
| コンテスト | |
| ユーザー | 
                             🍮かんプリン
                         | 
                    
| 提出日時 | 2020-08-29 16:06:03 | 
| 言語 | C++14  (gcc 13.3.0 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 1,695 ms / 4,000 ms | 
| コード長 | 1,469 bytes | 
| コンパイル時間 | 1,785 ms | 
| コンパイル使用メモリ | 172,112 KB | 
| 実行使用メモリ | 6,824 KB | 
| 最終ジャッジ日時 | 2024-11-20 22:58:05 | 
| 合計ジャッジ時間 | 17,134 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge2 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 2 | 
| other | AC * 31 | 
ソースコード
/**
 *   @FileName	a.cpp
 *   @Author	kanpurin
 *   @Created	2020.08.29 16:05:53
**/
#include "bits/stdc++.h" 
using namespace std; 
typedef long long ll;
template<typename T>
vector<T> enum_div(T n) {
    vector<T> ret;
    for (T i = 1; i * i <= n; ++i)
    {
        if (n % i == 0)
        {
            ret.push_back(i);
            if (i * i != n)
            {
                ret.push_back(n / i);
            }
        }
    }
    return ret;
}
int main() {
    int n;cin >> n;
    while(n--) {
        int x,y;scanf("%d %d",&x,&y);
        if (x == y) {
            ll ans = 0;
            ans += x - 1;
            ans += enum_div(x).size() - 1;
            if (x % 2 == 0) ans--;
            printf("%lld\n", ans);
        }
        else {
            if (x < y) swap(x,y);
            auto v1 = enum_div(x + y);
            sort(v1.begin(), v1.end());
            auto v2 = enum_div(x - y);
            sort(v2.begin(), v2.end());
            int t = 0;
            int ans = 0;
            for (int i = 0; i < v2.size(); i++) {
                while(t < v1.size() && v2[i] + 2 >= v1[t]) {
                    if (v2[i] + 2 == v1[t]) {
                        int a = v1[v1.size()-1] / v1[t];
                        int b = v2[v2.size()-1] / v2[i];
                        if (a > b && a % 2 == b % 2) ans++;
                    }
                    t++;
                }
            }
            printf("%d\n",ans);
        }
    }
    return 0;
}
            
            
            
        
            
🍮かんプリン