0%

思路讲解

image

这道题目本身不难,但上界的确定没那么好想

AC代码

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

如果上界是sqrt(N)sqrt(N) 其实桌子是够的,但是不一定能找到最优解。

通过排布规律我们知道他其实是呈三角形排布,所以要变换上界为sqrt(2N)sqrt(2*N)

1
2
3
4
5
6
7
8
9
10
11
12
for(int x=0;x<=sqrtl(2*N);++x){
for(int y=0;y<=sqrtl(2*N);++y){
vis[x][y]=false;
for(int j=0;j<4;++j){
ll fx=3*x+dx[j],fy=3*y+dy[j];
ll dis=genDis(fx,fy,j);
pq.push((arr){fx,fy,x,y,dis});
pq1.push((arr){fx,fy,x,y,dis});
visB[fx][fy]=false;
}
}
}

思路讲解

注意到

AC代码

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

思路讲解

感觉是dp,因为是计算路径数量。

首先我们将dp状态定义为到达该点的路径数量(其实也就是同一行之间只能从右往左转移)

image

然后转移方式如上图所示。

AC代码

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

这个测试组数7有点问题

https://codeforces.com/contest/2091/submission/316079483

最后发现是没取模,6.

思路讲解

解释最小公倍数的计算原理

ab=lcm(a,b)gcd(a,b)a \cdot b = lcm(a, b) \cdot gcd(a, b)

这个可以用质因数唯一分解定理解释

image

或者用上面这张图来解释,product相当于就是把交集部分再乘了一遍,一共乘了两遍。那么lcm=product/gcd(a,b)lcm=product/gcd(a,b),相当于就是把多乘的交集部分给去掉了。


上面其实只是介绍了一下题目背景。

理解了上面这张图,那么其实就好搞多了,F(a,b)=lcm(a,b)/gcd(a,b)F(a,b)=lcm(a,b)/gcd(a,b) 其实就是去掉中间的交集两边省的东西。按照题目要求 F(a,b)F(a,b) 必须为质数。那么其实就是要求两遍剩的,一边是1,一边是一个质数。

AC代码

https://codeforces.com/contest/2091/submission/315904464

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

思路讲解

这个还是要写的更细致一点,检查函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
inline bool check(ll x){
// ll res=ceil((M*N)*1.0l/(x+1));
// ll rem=K%x;
ll res=x*(M/(x+1));
ll usedBlock=(x+1)*(M/(x+1));
res+=max(0ll,(M-usedBlock));
// #ifdef LOCAL
// cerr << x<<" "<< res << '\n';
// #endif
if(res*N>=K){
return true;
}
return false;
}

AC代码

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