0%

思路讲解

其实这个题面应该是一个很经典的类似于莫顿编码的东西。

当然,和莫顿编码还是稍微有点区别

image

思路就是针对每个询问递归的找就行了。

AC代码

https://codeforces.com/contest/2093/my

心路历程(WA,TLE,MLE……)

思路讲解

参考以下题解:

https://www.luogu.com.cn/article/z6wql8q2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FOR(i,1,N){cin>>P[i];}
FOR(i,0,N){ // 抽到第i张卡,有多大的概率抽到j张稀有卡
FOR(j,0,N){
if(i>0 && j>0){
// 这第i张没出货 第i张出货了
dp[i][j]=dp[i-1][j]*(1.0-P[i]/100.0)+dp[i-1][j-1]*(P[i]/100.0);
}else if(j==0 && i>0){
dp[i][j]=dp[i-1][j]*(1.0-P[i]/100.0);
}else if(i==0 && j==0){
dp[i][j]=1.0;
}else{ // 剩下的抽0张卡,获得>0张卡的概率自然是0
dp[i][j]=0;
}
}
}

前面这个求抽到第 i 张卡,有多大的概率恰好抽到 j 张稀有卡,还是不难的。

但是这道题目要求的是抽到至少 X 张卡的数学期望,这个的转移有点难,也有点难想。

expi=1+j=0Nexpmax(0,ij)×dp[N][j]exp_i=1+\displaystyle\sum_{j=0}^{N}exp_{max(0,i-j)}\times dp[N][j]

( $ exp_i$ 代表抽到至少 i 张的期望包数,dp[N][j]dp[N][j] 代表该包抽到恰好 j 张稀有卡的概率 )

这个式子初看很难理解,其实细看之下,还是不那么难理解的,1是我这次抽,所以 +1+1,但是我们是要转移的,需要从别的情况转移过来,那从哪些情况那?其实就是从 j=0Nexpmax(0,ij)\displaystyle\sum_{j=0}^{N}exp_{max(0,i-j)} 这些情况转移过来,但是这些转移是有概率的,多大的概率那?dp[N][j]dp[N][j]

当然因为左右两边都包含 expiexp_i 其实我们还要进行一个移项。

expi=1+expi×dp[N][0]+j=1Nexpmax(0,ij)×dp[N][j]expi(1dp[N][0])=1+j=1Nexpmax(0,ij)×dp[N][j]expi=(1+j=1Nexpmax(0,ij)×dp[N][j]) / (1dp[N][0])exp_i=1+exp_i\times dp[N][0]+\displaystyle\sum_{j=1}^{N}exp_{max(0,i-j)}\times dp[N][j]\\ exp_i(1-dp[N][0])=1+\displaystyle\sum_{j=1}^{N}exp_{max(0,i-j)}\times dp[N][j]\\ exp_i=(1+\displaystyle\sum_{j=1}^{N}exp_{max(0,i-j)}\times dp[N][j])\ /\ (1-dp[N][0])

你可能会说,我还是不理解这个 +1+1,或者为什么不是直接用 X/每包的期望稀有卡数量X/每包的期望稀有卡数量。那么我问你,这个得到至少一张稀有卡的期望可能小于 1 吗?不可能吧,因为不可能一包卡都不开就拿到了一张稀有卡吧?所以其实这个 +1+1 就是这里的转移必须要用开卡包来转移。

AC代码

https://atcoder.jp/contests/abc382/submissions/65982174

心路历程(WA,TLE,MLE……)

思路讲解

1
2
3
4
// 首先,上面的块是不会影响下面的块,只有下面的块影响上面的块的份
// 思路其实也不复杂,就是看在这个块下面的块中最高的在哪里。
// 相当于一个range最小值查询,需要用线段树区间修改

AC代码

https://atcoder.jp/contests/abc382/submissions/64644331

心路历程(WA,TLE,MLE……)

思路讲解

ABC-383-D - 9 Divisors 

其实这个约数个数定理是显然的

你想p1的指数有0e10~e_1也就是e1+1e_1+1种选择,同理,每种都有ek+1e_k+1种选择

那么根据乘法原理,约束个数也就是 d(n)=(e1+1)(e2+1)(ek+1)d(n)=(e_1+1)(e_2+1)…(e_k+1)

当然喽,只有素因子可以这么玩,非素因子这么玩可能会有重复


当然这道题目关键点不在上面。

N=p1e1p2e2N=p_1^{e_1}p_2^{e_2} 由题意可得,e1为偶数,e2也为偶数。所以其实400数要求是完全平方数,而且是只由两个素因子构成。那么其实也就是要求平方数由两个素因子组成。

哈哈,其实这种也是有点套路,一般来说这种都是直接枚举素因子的

我们用埃氏筛筛出所有1e6以内的素数,存储在primes中。然后就枚举就完了。

AC代码

心路历程(WA,TLE,MLE……)

这个ll是非常需要的,写成int以后就TLE了,可能是因为溢出了。

1
2
3
4
5
6
7
8
9
10
11
12
13
for(int i=0;i<primes.size();++i){
ll p=primes[i];
for(ll j=p;j<=MAXN-10;j*=p){
for(int k=i+1;k<primes.size();++k){
ll pk=primes[k];
if(pk*j>MAXN-10) break;
for(ll p_k=pk;p_k<=MAXN-10;p_k*=pk){
if(p_k*j>MAXN-10) break;
fitNum.pb(p_k*j);
}
}
}
}

思路讲解

赛时想到思路了,也写出来了,但是死活都会WA四个点。

这种问题一般就是转化成二进制想,其实2^a就是二进制下右移a位。

最后靠AI手写了个二分的开方程序过了,这个是在有点离谱,现在在想我的程序为什么会WA。

找到一个博客,说sqrt是有点问题。

https://codeforces.com/blog/entry/107717

利用sqrtl就过了,离谱,floor(sqrt(i))就不行。

其实sqrtl其实是传入参数为long double,那么其实还是精度问题。我直接这么调用其实还有一个自动向下的隐式转换。

https://en.cppreference.com/w/c/numeric/math/sqrt

AC代码

https://atcoder.jp/contests/abc400/submissions/64576953

心路历程(WA,TLE,MLE……)

666