結果
| 問題 |
No.997 Jumping Kangaroo
|
| コンテスト | |
| ユーザー |
Chanyuh
|
| 提出日時 | 2020-02-23 17:09:09 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 4,614 bytes |
| コンパイル時間 | 2,134 ms |
| コンパイル使用メモリ | 198,388 KB |
| 最終ジャッジ日時 | 2025-01-09 02:02:14 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 23 WA * 2 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int ui;
const ll mod = 1000000007;
const ll INF = (ll)1000000007 * 1000000007;
typedef pair<int, int> P;
#define stop char nyaa;cin>>nyaa;
#define rep(i,n) for(int i=0;i<n;i++)
#define per(i,n) for(int i=n-1;i>=0;i--)
#define Rep(i,sta,n) for(int i=sta;i<n;i++)
#define Per(i,sta,n) for(int i=n-1;i>=sta;i--)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define per1(i,n) for(int i=n;i>=1;i--)
#define Rep1(i,sta,n) for(int i=sta;i<=n;i++)
typedef long double ld;
typedef complex<ld> Point;
const ld eps = 1e-8;
const ld pi = acos(-1.0);
typedef pair<ll, ll> LP;
template<int mod>
struct ModInt {
long long x;
ModInt() : x(0) {}
ModInt(long long y) : x(y >= 0 ? y % mod : (mod - (-y) % mod) % mod) {}
explicit operator int() const {return x;}
ModInt &operator+=(const ModInt &p) {
if((x += p.x) >= mod) x -= mod;
return *this;
}
ModInt &operator-=(const ModInt &p) {
if((x += mod - p.x) >= mod) x -= mod;
return *this;
}
ModInt &operator*=(const ModInt &p) {
x = (int)(1LL * x * p.x % mod);
return *this;
}
ModInt &operator/=(const ModInt &p) {
*this *= p.inverse();
return *this;
}
static ModInt add_identity(){return ModInt(0);}
static ModInt mul_identity(){return ModInt(1);}
ModInt operator-() const { return ModInt(-x); }
ModInt operator+(const ModInt &p) const { return ModInt(*this) += p; }
ModInt operator-(const ModInt &p) const { return ModInt(*this) -= p; }
ModInt operator*(const ModInt &p) const { return ModInt(*this) *= p; }
ModInt operator/(const ModInt &p) const { return ModInt(*this) /= p; }
bool operator==(const ModInt &p) const { return x == p.x; }
bool operator!=(const ModInt &p) const { return x != p.x; }
ModInt inverse() const{
int a = x, b = mod, u = 1, v = 0, t;
while(b > 0) {
t = a / b;
a -= t * b;
swap(a, b);
u -= t * v;
swap(u, v);
}
return ModInt(u);
}
ModInt power(long long p) const{
int a = x;
if (p==0) return 1;
if (p==1) return ModInt(a);
if (p%2==1) return (ModInt(a)*ModInt(a)).power(p/2)*ModInt(a);
else return (ModInt(a)*ModInt(a)).power(p/2);
}
ModInt power(const ModInt p) const{
return ((ModInt)x).power(p.x);
}
friend ostream &operator<<(ostream &os, const ModInt<mod> &p) {
return os << p.x;
}
friend istream &operator>>(istream &is, ModInt<mod> &a) {
long long x;
is >> x;
a = ModInt<mod>(x);
return (is);
}
};
using modint = ModInt<mod>;
int n,w,a[45];
ll k;
template<typename R, size_t N>
struct SquareMatrix{
typedef array<R, N> arr;
typedef array<arr, N> mat;
mat dat;
SquareMatrix(){
for(size_t i=0;i<N;i++)
for(size_t j=0;j<N;j++)
dat[i][j]=R::add_identity();
}
bool operator==(const SquareMatrix& a) const{
return dat==a.dat;
}
size_t size() const{return N;}
arr& operator[](size_t k){return dat[k];}
const arr& operator[](size_t k) const {return dat[k];}
static SquareMatrix add_identity(){return SquareMatrix();}
static SquareMatrix mul_identity(){
SquareMatrix res;
for(size_t i=0;i<N;i++) res[i][i]=R::mul_identity();
return res;
}
SquareMatrix operator*(const SquareMatrix &B) const{
SquareMatrix res;
for(size_t i=0;i<N;i++)
for(size_t j=0;j<N;j++)
for(size_t k=0;k<N;k++)
res[i][j]=res[i][j]+(dat[i][k]*B[k][j]);
return res;
}
SquareMatrix operator+(const SquareMatrix &B) const{
SquareMatrix res;
for(size_t i=0;i<N;i++)
for(size_t j=0;j<N;j++)
res[i][j]=dat[i][j]+B[i][j];
return res;
}
SquareMatrix pow(long long n) const{
SquareMatrix a=*this,res=mul_identity();
while(n){
if(n&1) res=res*a;
a=a*a;
n>>=1;
}
return res;
}
};
modint dp(int m,int ban=-1){
vector<modint> v(m+1,0);
v[0]=1;
Rep(i,0,m+1){
rep(j,n){
if(i+a[j]==ban) continue;
if(i+a[j]<=m){
v[i+a[j]]+=v[i];
}
}
}
return v[m];
}
void solve(){
cin >> n >> w >> k;
rep(i,n){
cin >> a[i];
}
modint p=dp(w);
modint q=dp(2*w,w);
using SM = SquareMatrix<modint, 2>;
SM A;
A[0][0]=p;A[0][1]=q;A[1][0]=(modint)1;
A=A.pow(k);
cout << A[0][0] << endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout << fixed << setprecision(50);
solve();
}
Chanyuh