結果
問題 | No.75 回数の期待値の問題 |
ユーザー | Taiki0715 |
提出日時 | 2023-08-17 17:19:27 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 22 ms / 5,000 ms |
コード長 | 4,895 bytes |
コンパイル時間 | 4,700 ms |
コンパイル使用メモリ | 269,324 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-11-26 15:06:04 |
合計ジャッジ時間 | 5,248 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,816 KB |
testcase_01 | AC | 3 ms
6,816 KB |
testcase_02 | AC | 2 ms
6,820 KB |
testcase_03 | AC | 2 ms
6,820 KB |
testcase_04 | AC | 2 ms
6,816 KB |
testcase_05 | AC | 2 ms
6,816 KB |
testcase_06 | AC | 2 ms
6,816 KB |
testcase_07 | AC | 2 ms
6,816 KB |
testcase_08 | AC | 2 ms
6,820 KB |
testcase_09 | AC | 2 ms
6,816 KB |
testcase_10 | AC | 2 ms
6,820 KB |
testcase_11 | AC | 2 ms
6,820 KB |
testcase_12 | AC | 2 ms
6,816 KB |
testcase_13 | AC | 2 ms
6,816 KB |
testcase_14 | AC | 2 ms
6,820 KB |
testcase_15 | AC | 2 ms
6,820 KB |
testcase_16 | AC | 4 ms
6,816 KB |
testcase_17 | AC | 11 ms
6,820 KB |
testcase_18 | AC | 18 ms
6,816 KB |
testcase_19 | AC | 22 ms
6,820 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; #if __has_include(<atcoder/all>) #include <atcoder/all> using namespace atcoder; template<int mod>istream &operator>>(istream &is,static_modint<mod> &a){long long b;is>>b;a=b;return is;} istream &operator>>(istream &is,modint &a){long long b;cin>>b;a=b;return is;} #endif using ll=long long; using ull=unsigned long long; using P=pair<ll,ll>; template<typename T>using minque=priority_queue<T,vector<T>,greater<T>>; template<typename T>bool chmax(T &a,const T &b){return (a<b?(a=b,true):false);} template<typename T>bool chmin(T &a,const T &b){return (a>b?(a=b,true):false);} template<typename T1,typename T2>istream &operator>>(istream &is,pair<T1,T2>&p){is>>p.first>>p.second;return is;} template<typename T>istream &operator>>(istream &is,vector<T> &a){for(auto &i:a)is>>i;return is;} template<typename T1,typename T2>void operator++(pair<T1,T2>&a,int n){a.first++,a.second++;} template<typename T1,typename T2>void operator--(pair<T1,T2>&a,int n){a.first--,a.second--;} template<typename T>void operator++(vector<T>&a,int n){for(auto &i:a)i++;} template<typename T>void operator--(vector<T>&a,int n){for(auto &i:a)i--;} #define reps(i,a,n) for(int i=(a);i<(n);i++) #define rep(i,n) reps(i,0,n) #define all(x) x.begin(),x.end() #define pcnt(x) __builtin_popcount(x) ll myceil(ll a,ll b){return (a+b-1)/b;} #ifdef LOCAL #include "debug.h" #else #define debug(...) static_cast<void>(0) template<typename T1,typename T2>ostream &operator<<(ostream &os,const pair<T1,T2>&p){os<<p.first<<' '<<p.second;return os;} #endif void SOLVE(); int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); #ifdef LOCAL clock_t start=clock(); #endif int testcase=1; //cin>>testcase; for(int i=0;i<testcase;i++){ SOLVE(); } #ifdef LOCAL cout<<"time:"; cout<<(clock()-start)/1000; cout<<"ms\n"; #endif } template<class T> struct Matrix{ vector<vector<T>>A; Matrix(int h,int w):A(h,vector<T>(w,0)){} Matrix(int n):A(n,vector<T>(n,0)){} size_t height()const{return A.size();} size_t width()const{return A[0].size();} const vector<T> &operator[](int k)const{return (A.at(k));} vector<T> &operator[](int k){return (A.at(k));} Matrix I(size_t n){ Matrix m(n); rep(i,n)m[i][i]=1; return m; } Matrix &operator+=(const Matrix &B){ size_t h=height(),w=width(); assert(h==B.height()); assert(w==B.width()); rep(i,h)rep(j,w)(*this)[i][j]+=B[i][j]; return *this; } Matrix &operator-=(const Matrix &B){ size_t h=height(),w=width(); assert(h==B.height()); assert(w==B.width()); rep(i,h)rep(j,w)(*this)[i][j]-=B[i][j]; return *this; } Matrix &operator*=(const Matrix &B){ size_t h=height(),w=B.width(),p=width(); assert(B.height()==p); vector<vector<T>>C(h,vector<T>(w,0)); rep(i,h)rep(k,p)rep(j,w)C[i][j]=(C[i][j]+(*this)[i][k]*B[k][j]); A.swap(C); return *this; } Matrix &operator^=(ll k){ assert(height()==width()); assert(k>=0); Matrix B=I(height()); while(k){ if(k&1)B*=*this; *this *= *this; k>>=1ll; } A.swap(B.A); return *this; } Matrix operator+(const Matrix &B)const{ return (Matrix(*this)+=B); } Matrix operator-(const Matrix &B)const{ return (Matrix(*this)-=B); } Matrix operator*(const Matrix &B)const{ return (Matrix(*this)*=B); } Matrix operator^(const ll k)const{ return (Matrix(*this)^=k); } T det(){ Matrix<T>b(*this); assert(this->height()==this->width()); T ret=1; rep(i,width()){ int id=-1; reps(j,i,width()){ if(b[j][i]!=0)id=j; } if(id==-1)return 0; if(i!=id){ ret*=-1; swap(b[i],b[id]); } ret*=b[i][i]; T inv=b[i][i].inv(); rep(j,width()){ b[i][j]*=inv; } reps(j,i+1,width()){ T x=b[j][i]; rep(k,width()){ b[j][k]-=b[i][k]*x; } } } return ret; } Matrix inv(){ assert(this->height()==this->width()); int n=this->height(); Matrix<T>b(*this); Matrix<T>ret=I(n); rep(i,n){ int id=-1; reps(j,i,n){ if(b[j][i]!=0)id=j; } assert(id!=-1); if(i!=id){ swap(b[i],b[id]); swap(ret[i],ret[id]); } T inv=(double)1/b[i][i]; rep(j,n){ b[i][j]*=inv; ret[i][j]*=inv; } rep(j,n)if(i!=j){ T x=b[j][i]; rep(k,n){ b[j][k]-=b[i][k]*x; ret[j][k]-=ret[i][k]*x; } } } return ret; } }; void SOLVE(){ int k; cin>>k; Matrix<double>mat(k); rep(i,k)reps(j,1,7){ if(i+j<k)mat[i][i+j]+=(double)1/6; else if(i+j!=k)mat[i][0]+=(double)1/6; } Matrix<double>I(k); rep(i,k)I[i][i]=1; mat=I-mat; mat=mat.inv(); mat*=mat; double ans=0; reps(i,1,7)if(k-i>=0)ans+=mat[0][k-i]/6; cout<<ans<<endl; }