結果

問題 No.3532 Non-Fourth-Power Sets
コンテスト
ユーザー 👑 potato167
提出日時 2026-05-04 23:52:00
言語 C++17
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++17 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
TLE  
実行時間 -
コード長 5,338 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 2,024 ms
コンパイル使用メモリ 221,832 KB
実行使用メモリ 11,988 KB
最終ジャッジ日時 2026-05-04 23:53:08
合計ジャッジ時間 21,498 ms
ジャッジサーバーID
(参考情報)
judge2_1 / judge3_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample -- * 1
other TLE * 1 -- * 19
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const ll ILL=2167167167167167167;
const int INF=2100000000;
#define rep(i,a,b) for (int i=(int)(a);i<(int)(b);i++)
#define all(p) p.begin(),p.end()
template<class T> using pq_ = priority_queue<T, vector<T>, greater<T>>;
template<class T> int LB(vector<T> &v,T a){return lower_bound(v.begin(),v.end(),a)-v.begin();}
template<class T> int UB(vector<T> &v,T a){return upper_bound(v.begin(),v.end(),a)-v.begin();}
template<class T> bool chmin(T &a,T b){if(b<a){a=b;return 1;}else return 0;}
template<class T> bool chmax(T &a,T b){if(a<b){a=b;return 1;}else return 0;}
template<class T> void So(vector<T> &v) {sort(v.begin(),v.end());}
template<class T> void Sore(vector<T> &v) {sort(v.begin(),v.end(),[](T x,T y){return x>y;});}
bool yneos(bool a,bool upp=false){if(a){cout<<(upp?"YES\n":"Yes\n");}else{cout<<(upp?"NO\n":"No\n");}return a;}
template<class T> void vec_out(vector<T> &p,int ty=0){
    if(ty==2){cout<<'{';for(int i=0;i<(int)p.size();i++){if(i){cout<<",";}cout<<'"'<<p[i]<<'"';}cout<<"}\n";}
    else{if(ty==1){cout<<p.size()<<"\n";}for(int i=0;i<(int)(p.size());i++){if(i) cout<<" ";cout<<p[i];}cout<<"\n";}}
template<class T> T vec_min(vector<T> &a){assert(!a.empty());T ans=a[0];for(auto &x:a) chmin(ans,x);return ans;}
template<class T> T vec_max(vector<T> &a){assert(!a.empty());T ans=a[0];for(auto &x:a) chmax(ans,x);return ans;}
template<class T> T vec_sum(vector<T> &a){T ans=T(0);for(auto &x:a) ans+=x;return ans;}
int pop_count(long long a){int res=0;while(a){res+=(int)(a&1),a>>=1;}return res;}
template<class T> T square(T a){return a * a;}

#include <atcoder/modint>
using mint = atcoder::modint1000000007;

//a以下の素数を列挙、計算量:Nlog(log(N))
vector<int> Eratosthenes(int a){
    if(a<2) return {};
    vector<int> p(a+1,1),ans;
    p[0]=0,p[1]=0;
    int k=2;
    while(k*k<=a){
        if(p[k]){
            ans.push_back(k);
            for(int i=2;i*k<=a;i++){
                p[i*k]=0;
            }
        }
        k++;
    }
    while(k<=a){
        if(p[k]) ans.push_back(k);
        k++;
    }
    return ans;
}

auto E = Eratosthenes(5000);

void solve();
// DEAR MYSTERIES / TOMOO
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t = 1;
    cin >> t;
    rep(i, 0, t) solve();
}

void solve(){
    int A, B;
    cin >> A >> B;
    vector<int> p;
    for (auto x : E) {
        if (A == 1) break;
        if (A % x == 0) {
            p.push_back(0);
            while (A % x == 0) {
                A /= x;
                p.back()++;
            }
        }
    }
    if (A != 1) p.push_back(1);
    mint ans = 1;
    for (auto x : p) {
        x *= B;
        x++;
        // cout << "# " << x << endl;
        vector<mint> dp = {1};
        rep(rp, 0, x) {
            vector<mint> n_dp(rp + 2);
            rep(i, 0, rp + 1) {
                n_dp[i + 1] += dp[i];
                n_dp[i] += dp[i] * (i - rp / 4);
            }
            swap(n_dp, dp);
            // for (auto y : dp) cout << y.val() << " ";
            // cout << endl;
        }
        ans *= vec_sum(dp);
    }
    cout << ans.val() << "\n";
}

/*
 * 一つ目の条件について、
 * z が S に含まれているなら
 * x, y = z とすることで自明に成り立つので、
 * S に含まれていない任意の正整数について、
 * この条件を満たさないようにしないといけない
 *
 * x = gp, y = gq としたとき、
 * z / g, gpq / z が互いに素な整数になる?
 * z / g = a とおくと、
 * g / z = 1 / a より
 * gpq / z = pq / a
 * 結局、pq の約数を入れてあげないといけないことになる
 * いやそうではないのか
 * pq の約数であって、素べきの指数が pq と一致もしくは 0 のものは取れる
 *
 * よって、集合は g, と長さ m の (p, e) の列で表され、
 * 集合の大きさは 2^m になるはず...
 * いや、1, 2, 3, 4, 6, 12 という集合もいけるはず
 * (p, (e1, e2, ... , en)) の列で表せるのか
 *
 *
 * 二つ目の条件について、
 * x = gp, y = gq としたとき、
 * lcm(x, y) / gcd(x, y) = pq であることから、
 * これが 4 乗数なのは、p, q どちらも 4 乗数であるということになる
 * min(p, q) != 1
 *
 * (p, (e1, ... en)) という列で表すとき、
 * (e1, ... , en) の中に mod 4 で等しいものは存在しないということになる
 *
 * w(x, y) って、素因数であって同じ数でないものが何個あるか
 * みたいな話になる
 * それを最小化するためには、
 * Y 側はなるべく、同じものを選ぶべきである
 * つまり、任意の素因数について、
 * e が完全一致か完全不一致ということになる
 *
 * つまり、
 * (0, 1, ... , B) を 適当に分割する方法が何通りかを求めればいい
 * サンプルは合いました
 * つまり、ここの高速化さえできればいい
 * 前計算だろうな
 * second スターリング数の亜種みたいになる
 * まず、スターリング数の総和の egf は exp(exp(x) - 1) らしい
 * それはそうかその中での並び替えとあれだから
 * スターリング数ですらこの大変さなのに、計算できるのだろうか
 *
 * 解けねー
 *
 */
0