為什麼題目常常讓選手對答案模一個數而不是利用自然溢出?
01-08
是不是因為與語言之間的差異有關?
當 x &> 1 的時候 2^x 不是質數……
C的有符號整數溢出是undefined behavior,而且就算是良好定義的,題目說一句% xxx比「輸出自然溢出的結果」也簡略的多
別的答主已經提到過了,C/C++的「自然溢出」是undefined behavior,別的語言里可能處理起來也會很麻煩。
另一方面,很多組合數學題的答案很容易有很多小質因子(比如其實是n!乘以什麼東西),要是去模一個大質數的話還好,模2^32很容易就變成0了……不過這麼說起來,倒是給出題者一個可能的陰招,你可以出個題,要求答案模2^32,然後標準答案依賴於算式里除了前31項以外都是0來減少計算量……C/C++的signed overflow是undefined behavior, Java不知道。
Java沒有unsigned
其實以前有看到過對1&<&<32取模的,用C的unsigned就行,但這種情況比較少。自然溢出相當於模 2^32 或者 2^64,如果輸出的數本身包含了大量的質因子 2 就會導致答案為 0。
比如某道題,答案是 2^n,n 很大,如果自然溢出的話,大家都輸出 0,無法根據輸出判斷選手演算法是否正確。類似地,某些用乘法原理計數的題也很容易出現這種情況。
以及如果對質數取模,可以用乘法逆元來計算除法,做題更靈活一些。
因為模素數的剩餘類環是個域模其它數只是個環證明兩個不同的數取模結果一樣的概率的時候要用到這個性質保證碰撞的概率較小oi裡面雖然很多yy但是偶爾也遵守一下基本法
推薦閱讀:
※如何評價CTSC2017評委在論文答辯過程中的表現?
※codeforces rating改革後,rating2200(master橙名)是什麼水平?
※如何評價 NOI2016 獎牌的樣式設計?
※如何度過oi的瓶頸期?
※獲得ioi 金牌的選手申請進入MIT Stanford CMU 計算機(CS)本科的概率?