結果

問題 No.766 金魚すくい
ユーザー ngtkanangtkana
提出日時 2020-03-31 01:00:58
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 5,376 bytes
コンパイル時間 2,201 ms
コンパイル使用メモリ 204,964 KB
実行使用メモリ 5,100 KB
最終ジャッジ日時 2023-09-05 13:20:51
合計ジャッジ時間 5,714 ms
ジャッジサーバーID
(参考情報)
judge12 / judge15
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
4,376 KB
testcase_01 AC 2 ms
4,380 KB
testcase_02 AC 1 ms
4,376 KB
testcase_03 WA -
testcase_04 AC 1 ms
4,380 KB
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 WA -
testcase_19 WA -
testcase_20 WA -
testcase_21 AC 2 ms
4,376 KB
testcase_22 WA -
testcase_23 WA -
testcase_24 AC 18 ms
4,904 KB
testcase_25 WA -
testcase_26 WA -
testcase_27 WA -
testcase_28 WA -
testcase_29 WA -
testcase_30 WA -
testcase_31 WA -
testcase_32 WA -
testcase_33 WA -
testcase_34 WA -
testcase_35 AC 4 ms
4,376 KB
testcase_36 AC 4 ms
4,376 KB
testcase_37 AC 18 ms
4,900 KB
testcase_38 AC 19 ms
4,832 KB
testcase_39 AC 19 ms
4,900 KB
testcase_40 AC 18 ms
4,896 KB
testcase_41 WA -
testcase_42 WA -
testcase_43 AC 2 ms
4,376 KB
testcase_44 AC 2 ms
4,380 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<bits/stdc++.h>
using lint=long long;
using real=long double;
template<class T>
T inverse(T a, T m){
    T u=0,v=1;
    while(a!=0){
        T t=m/a;
        m-=t*a;std::swap(a,m);
        u-=t*v;std::swap(u,v);
    }
    assert(m==1);
    return u;
}
template<class T>
class modular {
    public:
        int value;
        constexpr modular() = default;
        constexpr modular(const modular&) = default;
        constexpr modular(modular&&) = default;
        modular&operator=(const modular&) = default;
        modular&operator=(modular&&) = default;
        template<class U>modular(const U&x){value= normalize(x);}
        template<class U>
            static int normalize(const U& x){
                int v=static_cast<int>(-mod()<=x&&x<mod()?x:x%mod());
                if(v<0)v+=mod();
                return v;
            }
        template<class U>explicit operator U()const{return static_cast<U>(value);}
        constexpr static auto mod(){return T::value;}

        auto&operator+=(const modular&other) {if((value+=other.value)>=mod())value-=mod();return *this;}
        auto&operator-=(const modular& other){if((value-=other.value)<0)value+=mod();return *this;}
        template <class U>auto& operator+=(const U& other){return*this+=modular(other);}
        template <class U>auto& operator-=(const U& other){return*this-=modular(other);}
        auto operator-()const{return modular(-value);}
        auto&operator++(){return*this+=1;}
        auto&operator--(){return*this-=1;}
        auto operator++(int){modular result(*this);operator++();return result;}
        auto operator--(int){modular result(*this);operator--();return result;}

        template<class U=T>
            auto&operator*=(const modular&rhs){value=normalize(static_cast<std::int64_t>(value)*static_cast<std::int64_t>(rhs.value));return *this;}
        auto&operator/=(const modular&rhs){return*this*=modular(inverse(rhs.value, mod()));}
};
template<class T>struct is_modular:std::false_type{};
template<class T>struct is_modular <modular<T>>:std::true_type{};
template<class T>constexpr bool is_modular_v=is_modular<T>::value;
template<class t> bool operator==(const modular<t>& lhs, const modular<t>& rhs){return lhs()==rhs();}
template<class T,class U>bool operator==(const modular<T>& lhs, U rhs){return lhs==modular<T>(rhs);}
template<class T,class U>bool operator==(U lhs, const modular<T>& rhs){return modular<T>(lhs)==rhs;}
template<class T> bool operator!=(const modular<T>& lhs, const modular<T>& rhs){return !(lhs == rhs);}
template<class T,class U>bool operator!=(const modular<T>& lhs, U rhs){return !(lhs==rhs);}
template<class T,class U>bool operator!=(U lhs, const modular<T>& rhs){return !(lhs==rhs);}
template<class T> modular<T> operator+(const modular<T>& lhs, const modular<T>& rhs){return modular<T>(lhs)+=rhs;}
template<class T,class U>modular<T>operator+(const modular<T>& lhs,U rhs){return modular<T>(lhs)+=rhs;}
template<class T,class U>modular<T>operator+(U lhs,const modular<T>& rhs){return modular<T>(lhs)+=rhs;}
template<class T>modular<T>operator-(const modular<T>& lhs,const modular<T>& rhs){return modular<T>(lhs)-=rhs;}
template<class T,class U>modular<T>operator-(const modular<T>& lhs,U rhs){return modular<T>(lhs)-=rhs;}
template<class T,class U>modular<T>operator-(U lhs,const modular<T>& rhs){return modular<T>(lhs)-=rhs;}
template<class T>modular<T>operator*(const modular<T>& lhs,const modular<T>& rhs){return modular<T>(lhs)*=rhs;}
template<class T,class U>modular<T>operator*(const modular<T>& lhs,U rhs){return modular<T>(lhs)*=rhs;}
template<class T,class U>modular<T>operator*(U lhs,const modular<T>& rhs){return modular<T>(lhs)*=rhs;}
template<class T>modular<T>operator/(const modular<T>& lhs,const modular<T>& rhs){return modular<T>(lhs)/=rhs;}
template<class T,class U>modular<T>operator/(const modular<T>& lhs,U rhs){return modular<T>(lhs)/=rhs;}
template<class T,class U>modular<T>operator/(U lhs,const modular<T>& rhs){return modular<T>(lhs)/=rhs;}
template<class T,class U>
modular<T>power(const modular<T>&a,U b) {
    assert(b>=0);
    modular<T>x=a,ret=1;
    for (;b>0;b/=2){
        if(b%2==1)ret*=x;
        x*=x;
    }
    return ret;
}
template<class T>auto operator<<(std::ostream&os,const T&a)->std::enable_if_t<is_modular_v<T>,std::ostream&>{return os<<a.value;}
template<class T>auto operator>>(std::istream&is,T&a)->std::enable_if_t<is_modular_v<T>,std::istream&>{return is>>a.value;}
constexpr int mod=1'000'000'007;
using mint = modular<std::integral_constant<std::decay_t<decltype(mod)>, mod>>;
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,m;mint p;std::cin>>n>>m>>p;p/=100;
    lint N=m+n;
    std::vector<mint>fact(N+1),finv(N+1),a(n+1);
    fact.at(0)=1;
    for(lint i=1;i<=N;i++)fact.at(i)=fact.at(i-1)*i;
    finv.at(N)=1/fact.at(N);
    for(lint i=N;i>=1;i--)finv.at(i-1)=finv.at(i)*i;
    auto binom=[&](lint n,lint k){return fact.at(n)*finv.at(k)*finv.at(n-k);};
    mint r=power(p,m);
    for(lint i=0;i<n;i++){
        a.at(i)=binom(m-1+i,i)*r;
        r*=1-p;
    }
    a.at(n)=1-std::accumulate(a.begin(),a.begin()+n,mint{0});
    mint ans=0;
    for(lint i=1,cum=0;i<=n;i++){
        lint x;std::cin>>x;
        cum+=x;
        ans+=cum*a.at(i);
    }
    std::cout<<ans<<'\n';
}

0