上來先把除了2^k-1的部分分打滿了,寫的時候也一直不能集中精力,狀態很迷,而後就進了T2ide
最後10min回來寫2^k-1,而後寫着寫着想出了正解。。。而後就沒了。。。ui
通常套路:按位考慮spa
若是固定一個數x屬於[L,R],而後統計出[L,R]內每位上1的個數就能夠分類按位計算答案。code
發現不須要知道x具體是誰,我只須要知道全部的x(一塊兒考慮)的01分佈。blog
假設考慮到第i位:event
1.當該位爲1,能和該位爲0的造成1<<i的貢獻class
2.當該位爲0,能和該位爲1的造成1<<i貢獻cli
如今只要快速求出[L,R]內每位上1的個數。sed
%mzz,發現每一位上的01是有循環節的,節長爲1<<i+1循環
求出R、L的前綴桶再相減。
20分鐘寫完記搜就交了,也沒有對拍,試了下極限數據跑的飛快,也沒有從中發現問題。
而後就爆零了,輕敵我活該。
1 int dfs(int a,int b,int c) 2 { 3 if(~f[a][b][c])return f[a][b][c]; 4 if(!a&&!b&&!c)return 0; 5 if(a&&b&&c){ 6 int lim=min(a,min(b,c)); 7 F(i,1,lim)if(!dfs(a-i,b-i,c-i))return f[a][b][c]=1; 8 } 9 if(a&&b&&!c){ 10 int lim=min(a,b); 11 F(i,1,lim)if(!dfs(a-i,b-i,c))return f[a][b][c]=1; 12 } 13 if(a&&!b&&c){ 14 int lim=min(a,c); 15 F(i,1,lim)if(!dfs(a-i,b,c-i))return f[a][b][c]=1; 16 } 17 if(!a&&b&&c){ 18 int lim=min(b,c); 19 F(i,1,lim)if(!dfs(a,b-i,c-i))return f[a][b][c]=1; 20 } 21 if(a&&!b&&!c){ 22 F(i,1,a)if(!dfs(a-i,b,c))return f[a][b][c]=1; 23 } 24 if(!a&&b&&!c){ 25 F(i,1,b)if(!dfs(a,b-i,c))return f[a][b][c]=1; 26 } 27 if(!a&&!b&&c){ 28 F(i,1,c)if(!dfs(a,b,c-i))return f[a][b][c]=1; 29 } 30 return f[a][b][c]=0; 31 }
後面if進不去,腦抽。
shu ru fa zha le orz