ABC300 CDE Solution - By LaDeX

GIAOchen 2023-07-13 20:55:01 6


水。

枚举每个点,暴力判断。


LL Find(LL x, LL y){
	LL cnt1 = 0, cnt2 = 0;
	LL t1 = x, t2 = y;
	while (t1 >= 1 && t2 >= 1 && t1 <= H && t2 <= W){
		if (G[t1][t2] != '#')
			break;
		++ cnt1;
		t1 --, t2 --;
	}
	t1 = x, t2 = y;
	while (t1 >= 1 && t2 >= 1 && t1 <= H && t2 <= W){
		if (G[t1][t2] != '#')
			break;
		++ cnt1;
		t1 ++, t2 ++;
	}
	cnt1 --;
	t1 = x, t2 = y;
	while (t1 >= 1 && t2 >= 1 && t1 <= H && t2 <= W){
		if (G[t1][t2] != '#')
			break;
		++ cnt2;
		t1 --, t2 ++;
	}
	t1 = x, t2 = y;
	while (t1 >= 1 && t2 >= 1 && t1 <= H && t2 <= W){
		if (G[t1][t2] != '#')
			break;
		++ cnt2;
		t1 ++, t2 --;
	}
	cnt2 --;
	return min(cnt1, cnt2);
}
 
int main(){
	Fcin;
	cin >> H >> W;
	for (LL i = 1; i <= H; i ++){
		for (LL j = 1; j <= W; j ++){
			cin >> G[i][j];
		} 
	}
 
	for (LL i = 1; i <= H; i ++){
		for (LL j = 1; j <= W; j ++){
			cnt[Find(i, j) / 2] ++;
		}
	}
	for (LL i = 1; i <= min(H, W); i ++)
		cout << cnt[i] << " ";
	return 0;
}

因为 所以 最大可为 , 而 最大为 。枚举 再计数 即可。

而质数表的大小即为 的最值。 最小为 时, 最大为 约是

LL Is[M], Len = 0, Prim[M];
void Init(){
	Is[1] = 1;
	for (LL i = 2; i <= (LL)1e6; i ++){
		if (Is[i] == 0)
			Prim[++ Len] = i;
		
		for (LL j = 1; j <= Len && Prim[j] * i <= (LL)1e6; j ++){
			Is[Prim[j] * i] = 1;
			if (i % Prim[j] == 0)
				break;
		}
	}
	return ;
}
 
bool check(LL x){
	if (x == 1)
		return 0;
	if (x == 2 || x == 3)
		return 1;
	for (LL i = 2; i * i <= x; i ++)
		if (x % i == 0)
			return 0;
	return 1;
}

// ...

LL LimitA = (LL)pow(n, 0.2);
for (LL i = 1; Prim[i] <= LimitA; i ++){
	LL LimitB = (LL)pow(n / Prim[i] / Prim[i], 0.33334);
	for (LL j = i + 1; Prim[j] <= LimitB; j ++){
		for (LL k = j + 1; Prim[k] * Prim[k] * Prim[i] * Prim[i] * Prim[j] <= n; k ++){
			++ Ans;
		}
	}
}

显然,设 为从 变为 的概率,那么

所以直接记忆化搜索,记忆化用 map

除法用快速幂求逆元即可。

map<LL, LL> mp;

LL Qpow(LL x, LL k, LL p){
	LL tmp = x, res = 1;
	while (k){
		if (k & 1)
			res = (res * tmp) % p;
		tmp = (tmp * tmp) % p;
		k >>= 1;
	}
	return res;
}

LL Inv(LL x, LL p){
	return Qpow(x, p - 2, p);
}

LL DFS(LL x){
	if (mp.count(x))
		return mp[x];
	if (x == n)
		return 1;
	if (x > n)
		return 0;
	LL res = 0;
	for (LL i = 2; i <= 6; i ++)
		res += DFS(x * i);
	LL t = res * Inv5 % MOD;
	mp[x] = t;
	return t;
}

int main(){
	Fcin;
	cin >> n;
	Inv5 = Inv(5, MOD);
	cout << DFS(1);
	return 0;
}

{{ vote && vote.total.up }}