【BZOJ 4872】【2017六省联考】分手是祝愿
2017-04-27 14:14
232 查看
如果不考虑期望,只考虑最少次数:
从n开始考虑,n这盏灯只有n这个开关才能影响;当n这个开关确定之后,第n-1盏灯只有第n-1个开关才能影响……贪心一下就能知道最少次数了。
出题人良心啊给了这么多样例,还给了50分的k=n。
k=n是什么意思?显然开关的先后顺序是没有影响的,而且一个开关最多按一次(按两次等于没按),所以最多只要按n次,所以k=n直接输出最少方案就可以了。直接暴力枚举就能过,时间复杂度是O(nn√),当然还有各种奇奇怪怪的算法。
然后考虑概率怎么求。设f[i]表示还需按i次,显然:
f[i]=i(i<=k)
然后中间的数可以从两边推过来,也就是:
f[i]=f[i−1]∗in+f[i+1]∗n−in+1,
注意一下边界条件是f[n]=f[n−1]+1,因为不管怎么乱按都是对的。
为什么说要注意边界条件呢?因为第二个式子是一个二阶递推式,也就是说前面k个数知道了,后面n-k个数就可以全算出来了,最后一个数就要特殊处理。
然而天真的我这样做就是80分。。。。(出题人良心!)
为什么呢。。。。因为这是个二阶递推。。。从来没说初始值给了两个啊。。。k可以等于1啊。。。。。
怎么办呢?按照出题的说法是差分一下,也就是设g[i]=f[i]−f[i−1],感觉这个根本想不到,因为g虽然变成了一阶递推,而且g[n]=1,但是这个递推关系好复杂。。。
我说一下大概思路:先用f表示g,然后把那个f[i+1]套一下f的公式用f[i]和f[i−1]表示,然后移个项合个并就出来了。。。
丢结论:g[i]=g[i+1]∗(n−i)+ni
从n开始考虑,n这盏灯只有n这个开关才能影响;当n这个开关确定之后,第n-1盏灯只有第n-1个开关才能影响……贪心一下就能知道最少次数了。
出题人良心啊给了这么多样例,还给了50分的k=n。
k=n是什么意思?显然开关的先后顺序是没有影响的,而且一个开关最多按一次(按两次等于没按),所以最多只要按n次,所以k=n直接输出最少方案就可以了。直接暴力枚举就能过,时间复杂度是O(nn√),当然还有各种奇奇怪怪的算法。
然后考虑概率怎么求。设f[i]表示还需按i次,显然:
f[i]=i(i<=k)
然后中间的数可以从两边推过来,也就是:
f[i]=f[i−1]∗in+f[i+1]∗n−in+1,
注意一下边界条件是f[n]=f[n−1]+1,因为不管怎么乱按都是对的。
为什么说要注意边界条件呢?因为第二个式子是一个二阶递推式,也就是说前面k个数知道了,后面n-k个数就可以全算出来了,最后一个数就要特殊处理。
然而天真的我这样做就是80分。。。。(出题人良心!)
为什么呢。。。。因为这是个二阶递推。。。从来没说初始值给了两个啊。。。k可以等于1啊。。。。。
怎么办呢?按照出题的说法是差分一下,也就是设g[i]=f[i]−f[i−1],感觉这个根本想不到,因为g虽然变成了一阶递推,而且g[n]=1,但是这个递推关系好复杂。。。
我说一下大概思路:先用f表示g,然后把那个f[i+1]套一下f的公式用f[i]和f[i−1]表示,然后移个项合个并就出来了。。。
丢结论:g[i]=g[i+1]∗(n−i)+ni
#include<cmath> #include<cstdio> #include<vector> #include<queue> #include<cstring> #include<iomanip> #include<stdlib.h> #include<iostream> #include<algorithm> #define ll long long #define inf 1000000000 #define mo 100003 #define N 1000000 #define fo(i,a,b) for(i=a;i<=b;i++) #define fd(i,a,b) for(i=a;i>=b;i--) using namespace std; int n,k,i,j,p; int a ,f ,g ; int inv(int x) { int a = mo - 2; int res = 1; while (a) { if (a&1) res=(1ll*res*x)%mo; x=(1ll*x*x)%mo; a>>=1; } return res; } int main() { scanf("%d%d",&n,&k); fo(i,1,n) scanf("%d",&a[i]); fd(i,n,1) if (a[i]) { p++; fo(j,1,sqrt(i)) if (!(i%j)) if ((i/j)*(i/j)!=i) a[j]=1-a[j],a[i/j]=1-a[i/j]; else a[j]=1-a[j]; } fo(i,1,k) f[i] = i; g = 1; fd(i,n-1,1) g[i] = 1ll*(1ll*g[i+1]*(n-i)+n)*inv(i)%mo; fo(i,k+1,n) f[i] = (f[i-1] + g[i]) % mo; fo(i,1,n) f[p] = (1ll*f[p]*i) % mo; printf("%d\n",(f[p]+mo)%mo); return 0; }
相关文章推荐
- 【BZOJ4872】【六省联考2017】分手是祝愿(概率dp)
- BZOJ4872 [六省联考2017]分手是祝愿 【期望dp】
- [BZOJ4872][六省联考2017]分手是祝愿(期望DP)
- bzoj千题计划266:bzoj4872: [六省联考2017]分手是祝愿
- [BZOJ4872][六省联考2017]分手是祝愿
- 【bzoj4872】[Shoi2017]分手是祝愿 数论+期望dp
- bzoj 4872: [Shoi2017]分手是祝愿
- BZOJ4872: [Shoi2017]分手是祝愿-期望dp
- [BZOJ]4872 [SHOI2017] 分手是祝愿 期望DP
- bzoj 4872: [Shoi2017]分手是祝愿 期望dp
- BZOJ 4872 [Shoi2017] 分手是祝愿
- [bzoj4872] [Shoi2017]分手是祝愿
- bzoj4872 [Shoi2017]分手是祝愿 (期望概率DP)
- BZOJ 4872 [SHOI2017]分手是祝愿
- bzoj 4872: [Shoi2017]分手是祝愿 [期望DP]
- BZOJ_4872_[Shoi2017]分手是祝愿_概率与期望
- [期望 DP] BZOJ 4872 [Shoi2017]分手是祝愿
- [bzoj4872][Shoi2017]分手是祝愿
- bzoj 4872: [Shoi2017]分手是祝愿
- 【BZOJ4872】【SHOI2017】分手是祝愿 期望DP