結果
| 問題 | 
                            No.1728 [Cherry 3rd Tune] Bullet
                             | 
                    
| コンテスト | |
| ユーザー | 
                            👑  Kazun
                         | 
                    
| 提出日時 | 2021-08-17 04:01:32 | 
| 言語 | C++14  (gcc 13.3.0 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 97 ms / 2,000 ms | 
| コード長 | 1,452 bytes | 
| コンパイル時間 | 943 ms | 
| コンパイル使用メモリ | 90,388 KB | 
| 実行使用メモリ | 5,248 KB | 
| 最終ジャッジ日時 | 2024-10-07 08:49:40 | 
| 合計ジャッジ時間 | 2,014 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge2 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 27 | 
ソースコード
#include<iostream>
#include<algorithm>
#include<vector>
#include<unordered_map>
using namespace std;
using ll=long long;
vector<int> Divisors(int N){
    vector<int> D;
    int k=1;
    while (k*k<=N){
        if (N%k==0){
            D.push_back(k);
            if (k*k!=N){
                D.push_back(N/k);
            }
        }
        k++;
    }
    sort(D.begin(),D.end(),greater<int>());
    return D;
}
ll pow_mod(ll a, ll p, ll m){
    ll x=1;
    while (p){
        if (p&1){
            x*=a;
            x%=m;
        }
        a*=a; a%=m;
        p>>=1;
    }
    return x;
}
int main(){
    int T=0; cin >> T;
    ll mod=1000000007;
    int N,C;
    vector<int> D;
    int M,d,e,m,g;
    ll A,B,X;
    unordered_map<int, ll> H;
    for (int t=0; t<T; t++){
        cin >> N >> C;
        //gcd(N,x) の分布を調べる.
        D=Divisors(N);
        M=D.size();
        H.clear();
        for (int i=0; i<M; i++){
            d=D[i];
            H[d]=N/d;
            for (int j=0; j<i; j++){
                e=D[j];
                if (e%d==0) H[d]-=H[e];
            }
        }
        // σ^k 型の計算
        A=0;
        for (int i=0; i<M; i++){
            g=D[i]; m=2*g;
            A+=H[g]*pow_mod(C,m,mod);
            A%=mod;
        }
        // τ σ^k 型の計算
        B=N*pow_mod(C,N,mod);
        B%=mod;
        X=(A+B)*pow_mod(2*N,mod-2,mod);
        X%=mod;
        cout << X << endl;
    }
}
            
            
            
        
            
Kazun