寫這篇題解花了我很多不少時間,希望能過 awa
題意:
有 mm
m 個數,這 m
mm 個數能否由另外 n
nn 個數通過加減運算獲得。
對於每一次加減的操作,結果不能小於 0
00(角度不能小於 0
00);
對於大於等於 360
36036
0 的結果,對 360
36036
0 取模。(大於 360∘
360^
360∘
的角會轉一圈後繼續轉)
能則輸出 yes ,不能則輸出 no 。
思路:dp
\texttt
dp(揹包)、搜尋都可以。dp 太難想 這裡我只講搜尋。
對於每乙個狀態,只有加和減兩種狀態。所以只需要對每乙個狀態列舉每乙個數的加或減。
記錄已經過狀態,列舉中遇到了要獲得的數,就表明可以實現。列舉結束後還沒有遇到,則不能實現。
實現:
對於狀態 x
xx ,
拓展 (x±
a[i]
)mod
360(x\pm a[i]) \bmod 360
(x±a[i
])mo
d360
且 x±a[
i]≥0
x\pm a[i]\ge0
x±a[i]
≥0且未被拓展過。
上**!
#
include
using
namespace std;
int n,m;
int a[11]
,b;bool vis[
361]
;bool
bfs(
int end)
for(
int i=
1;i<=n;i++
)//可以不列舉減法,文後給出證明過程
/*cg=(t-a[i])%360;
if(cg>=0&&(!vis[cg]))
*/}}
return
false;}
intmain()
return0;
}
完結。
對於可以不列舉 x−a
x-ax−
a 的證明:
對於任意正整數 x
xx,a
aa,k
kk,p
pp,證明:
( x+
ak)m
od
360=x−
ap
(x+ak) \bmod 360 = x-ap
(x+ak)
mod3
60=x
−ap。
x
xx 指某一狀態。意思就是,只用加 k
kk 次 a
aa 就可以列舉到 x−a
px-ap
x−ap
。原式可轉化為: 360t+
x−ap
=x+a
k360t+x-ap=x+ak
360t+x
−ap=
x+ak
,t
tt 為任意正整數。
化簡,得:360t=
a(p+
k)
360t=a(p+k)
360t=a
(p+k
)。所以,只需證明 a(p
+k
)a(p+k)
a(p+k)
恒為 360
36036
0 倍數。
若 a
aa 為 360
36036
0 倍數,得證;
若 a
aa 不為 360
36036
0 倍數,
則若使 (p+
k)
(p+k)
(p+k
) 為 360
36036
0 倍數,k
=360−p
k=360-p
k=360−
p 即可。
又有 x−a
p≥
0x-ap\ge0
x−ap≥0
,則 p≤x
a<
360p\le \frac<360
p≤ax
<36
0。則 k
kk 在滿足 k
=360−p
k=360-p
k=360−
p 的條件下滿足 k
>
0k>0
k>
0,所以無論 p
pp 取多少都能滿足 (p+
k)
(p+k)
(p+k
) 為 360
36036
0 倍數。得證。
綜上,(x+
ak)m
od
360=x−
ap
(x+ak) \bmod 360 = x-ap
(x+ak)
mod3
60=x
−ap。
第一次自己寫 oi 證明題,有不對或不完善的地方請指出,謝謝qaq;
被打回x4 – 求過!
洛谷 P1101 題解
這道題可以用深搜 回溯 來寫,相信大部分人都是這麼想的,但是有些人可能在一些地方饒了半天,所以這裡就貼一下我的思路,個人覺得自己的很好懂,除了tx和ty那裡,但是tx和ty的那種用法對於輸出路徑的題目一般很實用 這個算是比較簡單的吧,題目裡給出了具體要找的字串,我們要做的就是對它進行8個方向的搜尋,...
洛谷 P1169 題解
請你在乙個黑白矩陣中選出乙個長方形 含正方形 和正方形的子矩陣,使得所有相鄰的點顏色不一樣。矩陣大小 兩條邊都 2000 2000 2 000輸入 3 31 0 1 0 1 0 1 0 0輸出4 6解釋給定矩陣 正方形 長方形 我的控制台是萌萌噠 ffc0cb粉色 乙個小技巧 如果您的控制台是像我的...
題解 洛谷 P3332
題目描述 權值線段樹套線段樹板子題 首先觀察題目,判斷為二維偏序問題 操作1為區間修改,所以一定是外部線段樹維護權值,內部線段樹維護所在區間,否則時間複雜度 qwq 為方便查詢,雜湊時我採用雜湊每個數的相反數的方法將求第k大轉換為求第k小 詢問可以直接想到的做法就是二分答案,查詢1 ans在區間內的...