bzoj 4872: [Shoi2017]分手是祝愿
2017-10-24 16:30
316 查看
题解:
先考虑正常的游戏最优策略:容易发现,一盏灯能影响的只能是前面的灯,所以最后一盏灯是一定要按的,所以唯一最优策略从后往前找,当遇到亮的灯就按一次。
然后就上期望dp。
设fi表示从最优i步的情况到i-1步的期望操作次数。
对于i<=k显然fi=1。
对于i>k因为是随便按的,所以有fi=in+(1−in)∗(1+fi+fi+1)
化简后得:fi=n+(n−i)∗fi+1i
然后答案就加一下。
感觉不是很难啊,为什么一点都想不到呢
code:
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #define LL long long using namespace std; const LL mod=100003; LL inv[100005],n,k,a[100005],f[100005]; void pre() { inv[1]=1; for(LL i=2;i<=n;i++) inv[i]=(mod-mod/i)*inv[mod%i]%mod; } int main() { scanf("%lld %lld",&n,&k); for(LL i=1;i<=n;i++) scanf("%lld",&a[i]); pre(); LL sum=0,fac=1; for(LL i=n;i>=1;i--) { for(LL j=i+i;j<=n;j+=i) a[i]^=a[j]; sum+=a[i]; (fac*=i)%=mod; } for(LL i=1;i<=k;i++) f[i]=1; for(LL i=n;i>k;i--) f[i]=(n+(n-i)*(f[i+1]))%mod*inv[i]%mod; LL ans=0; for(LL i=1;i<=sum;i++) (ans+=f[i])%=mod; printf("%lld",ans*fac%mod); }
相关文章推荐
- [bzoj4872] [Shoi2017]分手是祝愿
- 【BZOJ4872】[Shoi2017]分手是祝愿 数学+期望DP
- BZOJ 4872 [Shoi2017] 分手是祝愿
- BZOJ4872: [Shoi2017]分手是祝愿
- 【bzoj4872】[Shoi2017]分手是祝愿 数论+期望dp
- [BZOJ4872]-[Shoi2017]分手是祝愿-期望DP+画柿子
- BZOJ4872 [SHOI2017]分手是祝愿
- Bzoj4872: [Shoi2017]分手是祝愿
- BZOJ 4872 [SHOI2017]分手是祝愿
- Bzoj4872: [Shoi2017]分手是祝愿
- bzoj 4872: [Shoi2017]分手是祝愿 期望dp
- 【BZOJ4872】【SHOI2017】分手是祝愿
- bzoj 4872: [Shoi2017]分手是祝愿
- [期望 DP] BZOJ 4872 [Shoi2017]分手是祝愿
- [BZOJ]4872 [SHOI2017] 分手是祝愿 期望DP
- 【BZOJ】4872: [Shoi2017]分手是祝愿 期望DP
- bzoj 4872: [Shoi2017]分手是祝愿 [期望DP]
- bzoj4872 [Shoi2017]分手是祝愿 (期望概率DP)
- [bzoj4872][Shoi2017]分手是祝愿
- 【bzoj4872】[Shoi2017]分手是祝愿 数论+期望dp