結果

問題 No.997 Jumping Kangaroo
ユーザー ngtkanangtkana
提出日時 2020-04-10 00:37:15
言語 C++17
(gcc 13.2.0 + boost 1.83.0)
結果
AC  
実行時間 2 ms / 2,000 ms
コード長 3,589 bytes
コンパイル時間 2,379 ms
コンパイル使用メモリ 210,696 KB
実行使用メモリ 4,352 KB
最終ジャッジ日時 2023-10-12 03:53:16
合計ジャッジ時間 3,754 ms
ジャッジサーバーID
(参考情報)
judge15 / judge13
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
4,348 KB
testcase_01 AC 1 ms
4,348 KB
testcase_02 AC 2 ms
4,352 KB
testcase_03 AC 2 ms
4,348 KB
testcase_04 AC 2 ms
4,348 KB
testcase_05 AC 1 ms
4,348 KB
testcase_06 AC 1 ms
4,348 KB
testcase_07 AC 1 ms
4,352 KB
testcase_08 AC 1 ms
4,352 KB
testcase_09 AC 2 ms
4,348 KB
testcase_10 AC 2 ms
4,352 KB
testcase_11 AC 1 ms
4,352 KB
testcase_12 AC 2 ms
4,348 KB
testcase_13 AC 2 ms
4,348 KB
testcase_14 AC 2 ms
4,352 KB
testcase_15 AC 1 ms
4,348 KB
testcase_16 AC 2 ms
4,348 KB
testcase_17 AC 2 ms
4,348 KB
testcase_18 AC 1 ms
4,352 KB
testcase_19 AC 1 ms
4,352 KB
testcase_20 AC 2 ms
4,352 KB
testcase_21 AC 2 ms
4,348 KB
testcase_22 AC 2 ms
4,352 KB
testcase_23 AC 2 ms
4,348 KB
testcase_24 AC 1 ms
4,348 KB
testcase_25 AC 1 ms
4,348 KB
testcase_26 AC 1 ms
4,352 KB
testcase_27 AC 2 ms
4,352 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<bits/stdc++.h>
#define ALL(v) std::begin(v),std::end(v)
using lint=long long;
using ld=long double;
#define ENABLE_DEBUG 0
#ifdef NGTKANA
#include<debug.hpp>
#else
#define DEBUG(...)(void)0
#endif
lint mod=1'000'000'007;
lint inverse(lint x){
    DEBUG(x);
    assert(x%mod);
    lint y=1,u=mod,v=0;
    while(x){lint q=u/x;u-=q*x;std::swap(u,x);v-=q*y;std::swap(v,y);}
    assert(x==0&&std::abs(u)==1&&std::abs(y)==mod&&std::abs(v)<mod);
    return v<0?v+mod:v;
}
lint normalized(lint x){if(x<=-mod||mod<=x)x%=mod;if(x<0)x+=mod;return x;}
struct mint{
    lint value;
    mint()=default;
    mint(lint x):value(normalized(x)){}
};
std::ostream&operator<<(std::ostream&os,mint x){return os<<x.value;}
mint operator+(mint x,mint y){lint z=x.value+y.value;if(mod<=z)z-=mod;return mint{z};}
mint operator-(mint x,mint y){lint z=x.value-y.value;if(z<0)z+=mod;return mint{z};}
mint operator*(mint x,mint y){return mint{x.value*y.value%mod};}
mint operator/(mint x,mint y){return mint{x.value*inverse(y.value)%mod};}
mint&operator+=(mint&x,mint y){return x=x+y;}
mint&operator-=(mint&x,mint y){return x=x-y;}
mint&operator*=(mint&x,mint y){return x=x*y;}
mint&operator/=(mint&x,mint y){return x=x/y;}
bool operator==(mint x,mint y){return x.value==y.value;}
bool operator!=(mint x,mint y){return x.value!=y.value;}
mint power(mint x,lint y){mint z=1;for(;y;y>>=1){if(y&1)z*=x;x*=x;}return z;}
mint operator-(mint x){return mint(-x.value);}
using poly_t=std::vector<mint>;
struct resring{
    poly_t mod, qd, qinv;
    lint deg;
    resring()=default;
    resring(poly_t v):mod([&v]{while(!v.empty()&&v.back()==0)v.pop_back();return v;}()),
        qd([v=v]()mutable{mint x=1/v.back();v.pop_back();for(mint&y:v)y*=-x;return v;}()),
        qinv([v=v]()mutable{v.erase(v.begin());for(mint&x:v)x=-x;return v;}()),
        deg(v.size()-1){assert(deg);}
    poly_t&normalize(poly_t&a)const{
        for(;deg<(lint)a.size();a.pop_back()){
            for(lint i=0;i<deg;i++){
                a.at(a.size()-1-deg+i)+=a.back()*qd.at(i);
            }
        }
        return a;
    }
    poly_t mul(poly_t a, poly_t b)const{
        normalize(a),normalize(b);
        lint l=a.size(),m=b.size();
        poly_t c(l+m-1);
        for(lint i=0;i<l;i++)for(lint j=0;j<m;j++)c.at(i+j)+=a.at(i)*b.at(j);
        return normalize(c);
    }
    poly_t&mul_assign(poly_t&a, poly_t b)const{return a=mul(a,b);}
    poly_t pow(poly_t a, lint b)const{poly_t ans{1};for(;b;b>>=1){if(b&1)mul_assign(ans,a);mul_assign(a,a);}return ans;}
};
mint bruteforce(lint w,lint k,std::vector<lint> a){
    std::vector<mint>dp(w*k+1);
    dp.at(0)=1;
    for(lint i=0;i<=w*k;i++){
        for(lint x:a){
            if(w*k<i+x)continue;
            dp.at(i+x)+=dp.at(i);
        }
    }
    return dp.at(w*k);
}
int main(){
    std::cin.tie(nullptr);std::ios_base::sync_with_stdio(false);
    std::cout.setf(std::ios_base::fixed);std::cout.precision(15);
    lint n,w,k;std::cin>>n>>w>>k;
    std::vector<mint>dp(w+w+1);
    dp.at(0)=1;
    std::vector<lint>a(n);
    for(lint&x:a)std::cin>>x;
    for(lint i=0;i<=w+w;i++){
        for(lint x:a){
            if(w+w<i+x)continue;
            dp.at(i+x)+=dp.at(i);
        }
    }
    mint x=dp.at(w),y=dp.at(w+w)-dp.at(w)*dp.at(w);
    if(x==0&&y==0){
        std::cout<<0<<'\n';
        return 0;
    }
    DEBUG(x,y);
    resring res(poly_t{1,-x,-y});
    DEBUG(dmap(res.mod,[](mint x){return guess(x);}));
    DEBUG(dmap(res.qd,[](mint x){return guess(x);}));
    DEBUG(dmap(res.qinv,[](mint x){return guess(x);}));
    std::cout<<res.pow(res.qinv,k).at(0)<<'\n';
}
0