結果
問題 | No.75 回数の期待値の問題 |
ユーザー |
![]() |
提出日時 | 2023-08-17 17:19:27 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 24 ms / 5,000 ms |
コード長 | 4,895 bytes |
コンパイル時間 | 3,645 ms |
コンパイル使用メモリ | 259,288 KB |
最終ジャッジ日時 | 2025-02-16 08:59:13 |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 16 |
ソースコード
#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;}#endifusing 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;}#endifvoid SOLVE();int main(){ios::sync_with_stdio(false);cin.tie(nullptr);#ifdef LOCALclock_t start=clock();#endifint testcase=1;//cin>>testcase;for(int i=0;i<testcase;i++){SOLVE();}#ifdef LOCALcout<<"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;}