遲來的題解
本文更新到個人主頁中,後續如果有任何修正變動也只會在網頁端更新~
特別鳴謝小羽毛在羽貓球一題的題解:) 感謝興航學弟在T3的題解。
比賽連結:https://www.luogu.com.cn/contest/196515
T1
簽到題,所有參與選手均滿分。略。
T2
https://www.luogu.com.cn/article/37n1idam
T3
在題目中的提示已經很顯然了,如果我們讓所有的數都有某個公因子,那麼最簡單的辦法就是讓所有數都是偶數。
而剛好在題目中的操作,其實就是兩個數相乘。所以最理想的情況就是 奇數都去乘以偶數變成偶數。
關於這裡的思路,xh學弟是這樣講的:
最終要使整個序列的最大公約數大於 \(1\),實際上就是要使最後序列中每一個數字都有共同的因子。
假設我們確定了因子是誰,就只需要把不含該因子的數字乘到含該因子的數字上就可以了,操作次數就是序列中不含該因子數字的個數。
例如序列 \([3,6,9,7]\):
顯然 \(3\) 是被包含最多的因子,只需要對 \(7\) 操作一次,所以操作次數為一。問題轉化為如何找到這個因子,由於題中給到的區間是連續的,每兩個連續的數字中間一定有一個偶數,所以這個因子就是 \(2\),區間奇數的數量就是操作次數。
無論如何,最終我們的操作次數就變成了區間中奇數的數量。
需要注意的是對於長度為1的情況需要特殊判斷。
如果你能過樣例,你基本也能拿到滿分。
yxhのstd:(也可以看壓縮包裡的,zzt太懶惰了,懶得把幾個合併到一起。)
#include <iostream>
using namespace std;
int codd(int x){ return x/2+x%2; }
int main(){
int t;cin>>t;
while(t--){
bool flag=0;
int l,r,k;cin>>l>>r>>k;
if(codd(r)-codd(l-1)<=k) flag=1;
if(l==r){
flag=(l==1)?0:1;
}
cout<<(flag?"YES":"NO")<<endl;
}
}
T4
崽崽兔的想法太天才了
我們不妨把新數列的前幾項列出來:
原本的f函式:
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
值 | 1 | a | 1+a | 1+2a | 2+3a | 3+5a | 5+8a | 8+13a |
我們將常數項提取出來,再將a前面的係數項提取出來,分別列出常數表和係數表(b表和k表)
b表:
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
值 | 1 | 0 | 1 | 1 | 2 | 3 | 5 | 8 |
k表:
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
值 | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 |
相信對斐波那契數列熟悉的你一定發現了,我們的b表和k表都是符合斐波那契推理規律的!
那麼我們設定使用第i項,可以列出如下方程: b_i + k_i * i = x,經過移項,可以直接算出 i = (x-b_i)/k_i
那麼我們經過預處理,將b表和k表維護出來。接下來從小到大的列舉i,經過以上公式可以快速判斷出列舉的i是否能作為方程式的解。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e9;
const int maxk = 1e5;
int k[maxk+10],b[maxk+10];
int main() {
//freopen("fibonacci10.in","r",stdin);
//freopen("fibonacci10.out","w",stdout);
k[1]=0; k[2]=1;
b[1]=1; b[2]=0;
for(int i=3;i<=maxk;i++) {
k[i]=k[i-1]+k[i-2];
b[i]=b[i-1]+b[i-2];
}
int t,x;
cin>>t;
for(int zzt=1;zzt<=t;zzt++) {
cin>>x;
cout<<2<<" "<<x<<endl;
for(int i=3;i<=1e5;i++) {
if(b[i]>=x) break;
if((x-b[i]) % k[i] == 0) {
cout<<i<<" "<<(x-b[i])/k[i]<<endl;
}
}
}
}
出題人的小心得
由於這種宣發比賽的形式無論是對於twt工作室,還是對於出題人本人,都是一種全新的嘗試,故留下一點反思。
關於T1這種純簽到題太省事太簡單,後面可能考慮加大一點難度。
T2這種純板子題也沒有思考的價值,對於新生同學來說,完全沒接觸過動態規劃,只靠暴力也很難得到部分分。純dp不帶最佳化有60,難寫的搜尋拿30.這其實是不理想的。
T3這種題就是很好的正規化,我很滿意!有思維高度,有樂趣,只靠高中的數學基礎就可以推出來思考出來,這能讓大夥感受到演算法本身的樂趣。雖然對於高手一看奇偶性就能一眼秒。但是也算優秀題目了。可惜本次排的比較蠢,很多同學被T2勸退就不看了。
T4只能勉強及格,看似是方程之類的其實還是找規律的題目。如果找規律猜規律,我認為更理想的情況是猜測表象更復雜但結論更直觀甚至簡單的問題。這樣才好玩嘛,但是類似的題目很難控制得分。沒法送部分分出去。
總結
感謝大家的捧場配合,作為小萌新舉辦萌新歡樂賽,居然有這麼多人捧場,受寵若驚。
希望各位都能找到自己熱愛的領域並且為之努力,道阻且長,行則將至。