The 17th Heilongjiang Provincial Collegiate Programming Contest

A. Bookshelf Filling

对于求书架的最小宽度,其实是不好做的。但是如果把问题转换成给定一个宽度,判断这个宽度是否满足要求,那么就可以二分求解。注意到,宽度的变化也是满足单调性的。

需要注意的是,书本要horizontally水平放置,如果英语不好的话会做假题(点名某人

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ll a,b,n,m,h;
bool check(ll x){
ll ans1=(h-a)*(n/b);
ll ans2=((x-(n/b)*b)/b)*(h-b);
return (ans1+ans2)>=m-(x-n);
}
void solves(){
cin>>a>>b>>n>>m>>h;
ll l=n+1,r=n+m;
while(l<r){
ll mid=(l+r)>>1;
if(check(mid))
r=mid;
else
l=mid+1;
}
cout<<l<<endl;
}

D. Collision Detector

O1O_1的圆心是红色区域的内点的话就输出yes

不想写代码

D

E. Exclusive Multiplication

莫反不会做wfl

对于n=piain=\prod p_i^{a_i},定义ff

f(n)=i=1mpiai%2f(n)=\prod_{i=1}^{m}p_i^{a_i\%2}

对于给定序列{bi}\{b_i\},求

i=1nj=i+1nf(bi×bj)mod  (109+7)(1)\sum_{i=1}^n\sum_{j=i+1}^{n}f(b_i×b_j)\quad mod \;(10^9+7)\qquad(1)

注意到,ff是积性函数,但不是完全积性函数。对于f(bi×bj)f(b_i×b_j),我们考虑将其拆成f(bi)f(bj)h(bi,bj)f(b_i)f(b_j)h(b_i,b_j)的形式。

观察f(n)f(n)的定义,容易发现当nn的质因子的重数为偶数时,对ff不产生贡献。即

f(bj×bj)=f(bigcd(bi,bj)×bjgcd(bi,bj)×gcd(bi,bj)2)=f(bigcd(bi,bj)×bjgcd(bi,bj))=f(bigcd(bi,bj))×f(bjgcd(bi,bj))f(b_j × b_j)=f(\frac{b_i}{gcd(b_i,b_j)} × \frac{b_j}{gcd(b_i,b_j)} × gcd(b_i,b_j)^2 )=f(\frac{b_i}{gcd(b_i,b_j)} × \frac{b_j}{gcd(b_i,b_j)} )=f(\frac{b_i}{gcd(b_i,b_j)}) × f(\frac{b_j}{gcd(b_i,b_j)})

所以(1)(1)可化简为

i=1nj=i+1nf(bi×bj)=i=1nj=1nf(bi×bj)i=1nf(bi2)2=i=1nj=1nf(bi×bj)n2=i=1nj=1nf(bigcd(bi,bj))×f(bjgcd(bi,bj))n2=i=1nj=1nf(bi)f(gcd(bi,bj))×f(bj)f(gcd(bi,bj))n2=i=1nj=1nf(bi)×f(bj)f2(gcd(bi,bj))n2\begin{aligned} \sum_{i=1}^n\sum_{j=i+1}^{n}f(b_i×b_j) &=\frac{\sum_{i=1}^n\sum_{j=1}^{n}f(b_i×b_j)-\sum_{i=1}^{n}f(b_i^2)}{2}\\ &=\frac{\sum_{i=1}^n\sum_{j=1}^{n}f(b_i×b_j)-n}{2}\\ &=\frac{\sum_{i=1}^n\sum_{j=1}^{n}f(\frac{b_i}{gcd(b_i,b_j)}) × f(\frac{b_j}{gcd(b_i,b_j)})-n}{2}\\ &=\frac{\sum_{i=1}^n\sum_{j=1}^{n}\frac{f(b_i)}{f(gcd(b_i,b_j))} × \frac{f(b_j)}{f(gcd(b_i,b_j))}-n}{2}\\ &=\frac{\sum_{i=1}^n\sum_{j=1}^{n}\frac{f(b_i) × f(b_j)}{f^2(gcd(b_i,b_j))} -n}{2}\\ \end{aligned}

对于f(bi)×f(bj)f2(gcd(bi,bj))\frac{f(b_i) × f(b_j)}{f^2(gcd(b_i,b_j))}

ps这个先暂时🕊一下

F. 342 and Xiangqi

枚举49种情况取最小值,但其实由于具有对称性,只需要枚举一半。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int mp[10][10]={
{0},
{0,0,1,1,2,3,3,4},//1
{0,1,0,2,1,2,2,3},//2
{0,1,2,0,1,2,2,3},//3
{0,2,1,1,0,1,1,2},//4
{0,3,2,2,1,0,2,1},//5
{0,3,2,2,1,2,0,1},//6
{0,4,3,3,2,1,1,0},//7
};
void solves(){
int a1,a2,b1,b2;
cin>>a1>>a2>>b1>>b2;
cout<<min(mp[a1][b1]+mp[a2][b2],mp[a2][b1]+mp[a1][b2])<<endl;
}

H. Kanbun

主要是一开始看了很久才看明白在讲啥吧。。递归一下就好,栈模拟一下也行。不过一开始因为递归写的太无脑了,直接t了一发。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int n;string s;
int dfs(int idx){
for(int i=idx;i<n;i++){
if(s[i]=='('){
int r=dfs(i+1);
cout<<i+1<<" ";
i=r;
continue;
}
cout<<i+1<<" ";
if(s[i]==')')
return i;
}
}
void solves(){
cin>>n>>s;
dfs(0);
}

I. Equal Sum Arrays

对于整数kk的分拆其实是可以转换成探求方程的整数解个数Problem 1.0.0.)的模型,形如求共有多少个不同的非负整数向量(x1,x2,...,xr)(x_1,x_2,...,x_r),满足x1+x2+...+xr=nx_1+x_2+...+x_r=n的问题。

对于不同的rr进行求和,发现其实是一个二项式展开系数的求和。

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2023 JingyiQu
  • 访问人数: | 浏览次数:

如果这篇博客帮助到你,可以请我喝一杯咖啡~

支付宝
微信