在發現了3的二進位制特殊性質後,lhc認為形如1、3、7、15......2n−1之類的數具有共通的性質。但是他太懶了,請你幫他驗證結論吧。
現在,lhc要求你在1s內判斷對於給定多組的二進位制數num是否是2n−1的倍數。
多組資料,每組資料一行,包含乙個二進位制數num和整數n。
資料限制:
1≤len(num)≤10000
1≤n≤32
其中len(num)代表二進位制數num的長度。
每組資料輸出一行,如果num是2n−1的倍數,輸出「yes」,否則輸出「no」。
copy sample input
1111 4copy sample output101000111 3
yes1111(2)=15(10),15 mod 15=01111(2)=15(10),15mod 15=0no
101000111(2)=327(10),327 mod 7=5101000111(2)=327(10),327mod 7=5
lhc先考慮n=2,即mod=3的情況,上篇部落格中有講到把num兩位兩位拆分再求和得到sum,判斷sum是否為mod的倍數即可。
那麼,對於任意正整數n,mod=2^n-1,很容易想到把num按n位拆分再求和得到sum,判斷sum是否為mod的倍數就好啦。
我居然寫起了自己題目的題解,可還行,下面是三個標程。
#include #includec++標程#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define p(n) cout
#define ll long long
#define ull unsigned long long
#define elif else if
#define itrange(i,a,b) for(auto i=a;i!=b;++i)
#define rerange(i,a,b) for(auto i=a;i>=b;--i)
#define fill(arr,tmp) memset(arr,tmp,sizeof(arr))
#define ios ios::sync_with_stdio(false);cin.tie(0)
using
namespace
std;
string
word;
ll n;
void
init()
void
solve()
}cout
<
no":"
yes")<
; }
}int
main()
#python標程1這個有點偷懶了,不過它可以驗證結論的正確性(我想了一晚上怎麼把這個ac**卡掉,但是失敗了。。)
while
true:
try:
ss,n=input().split()
ss=int(ss,2)
n=(1
if ss%n else
"yes")
except
:
break
#python標程2這個是正經的python解法。。
while
true:
try:
tb, n =input().split()
n =int(n)
tb = tb[::-1]
mod = (1 << n) - 1tb += '
0' * (n - len(tb) %n)
tmp =0
for i in
range(0, len(tb), n):
tmp = (tmp + int(tb[i:i + n][::-1], 2)) %mod
print("no"
if tmp % mod else
"yes")
except
:
break
LeetCode 1018 可被5整除的二進位制字首
給定由若干 0 和 1 組成的陣列 a。我們定義 n i 從 a 0 到 a i 的第 i 個子陣列被解釋為乙個二進位制數 從最高有效位到最低有效位 返回布林值列表 answer,只有當 n i 可以被 5 整除時,答案 answer i 為 true,否則為 false。示例 1 輸入 0,1,1...
LeetCode 1018可被5整除的二進位制字首
給定由若干 0 和 1 組成的陣列 a。我們定義 n i 從 a 0 到 a i 的第 i 個子陣列被解釋為乙個二進位制數 從最高有效位到最低有效位 返回布林值列表 answer,只有當 n i 可以被 5 整除時,答案 answer i 為 true,否則為 false。示例 1 輸入 0,1,1...
bzoj1992鬼谷子的錢袋 二分亂搞 二進位制
time limit 10 sec memory limit 162 mb submit 3223 solved 2333 鬼谷子非常聰明,正因為這樣,他非常繁忙,經常有各諸侯車的特派員前來向他諮詢時政。有一天,他在咸陽遊歷的時候,朋友告訴他在咸陽最大的拍賣行 聚寶商行 將要舉行一場拍賣會,其中有一...