結果
| 問題 |
No.997 Jumping Kangaroo
|
| コンテスト | |
| ユーザー |
ngtkana
|
| 提出日時 | 2020-04-09 23:59:21 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 3,092 bytes |
| コンパイル時間 | 4,170 ms |
| コンパイル使用メモリ | 203,852 KB |
| 最終ジャッジ日時 | 2025-01-09 15:34:35 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge6 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 22 RE * 3 |
ソースコード
#include<bits/stdc++.h>
#define ALL(v) std::begin(v),std::end(v)
using lint=long long;
using ld=long double;
lint mod=1'000'000'007;
lint inverse(lint 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 modrev;
lint deg;
resring()=default;
resring(poly_t v):modrev([&v]{mint x=1/v.back();v.pop_back();for(mint&y:v)y*=x;return v;}()),deg(modrev.size()){}
poly_t&normalize(poly_t&a)const{
for(;modrev.size()<a.size();a.pop_back()){
for(lint i=0;i<deg;i++){
a.at(a.size()-1-deg+i)-=a.back()*modrev.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);
resring res(poly_t{1,-x,-y});
mint ans=res.pow(poly_t{x,y},k).at(0);
std::cout<<res.pow(poly_t{x,y},k).at(0)<<'\n';
}
ngtkana