真是傷心。。。這場比賽我兩個題在20min中全部做完,全部因為忘了特判導致fst,我是sb。。。
最水的題,純比手速,結果我為了搶時間忘記特判,最後fst掉了。。。
要特判的情況就是輸出的答案為0的情況。。。
#include
#include
#include
#include
#include
#define maxn 500
using
namespace
std;
char s[maxn];
int ans[maxn],ss[maxn];
int main()
for(int i=1;i<=len;i++)
ans[i]=(ans[i]+ss[i])%b;
}int tmp=maxn-1;
while(!ans[tmp]&&tmp>=1) tmp--;
if(!tmp) printf("0"); //坑爆了!!!
for(int i=tmp;i>=1;i--)
printf("\n");
}return
0;}
還是特判,
n>
1 時最終答案為2n
−2,n=1
時顯然答案為1。。。
但是僅僅這些還不夠,由於題目中所有數的範圍在1e18範圍內,做乘法時可能爆long long,因此要用快速加,然後如果n=
1,p=
1 時答案為0,顯然n=
1 時只輸出
1 是錯的,要輸出1 mod p
#include
#include
#include
using
namespace
std;
typedef
long
long
int ll;
ll mul(ll a,ll b,ll p)
return ans;
}ll fastpow(ll base,ll pow,ll p)
return ans;
}int main()
ll ans=fastpow(2,n,p);
ans=(ans-2+p)%p;
printf("%i64d\n",ans);
}return
0;}
標準做法是dp。。。不是很好想。。。。
這裡我用的做法是參考別人的一種非常巧妙的二分+深搜。我們可以先按照每個題目最早可以開始做的時刻(li
−ti)公升序排序,顯然所有題目權值之和
當然,這樣的爆搜有很多可以剪枝的地方,我們可以預處理出排序後的題目權值的字首和,如果在搜尋過程中發現,如果1~當前題都做出來,仍然做不到w分,那麼說明當前的dfs狀態顯然是無解的,直接退出。
#include
#include
#include
#include
#include
#define maxn 100
using
namespace
std;
typedef
long
long
int ll;
struct prob
probs[maxn];
ll sum[maxn];
int n,w;
bool cmp(prob a,prob b)
bool dfs(int x,int t,ll solved) //zuo le x ti,shi jian yong le time,zuo chu le solved fen
int main()
while(lowerbound<=upperbound)
else lowerbound=mid+1;
}printf("%d\n",ans);
}return
0;}
BestCoder 31 簡要題解
zhw神犇出題就是強啊。john 在 x 軸上擁有 n個點,他們的座標分別為 x i 0 i 0,1,2,n 1 他想知道有多少對 b 滿足 x b x a k a。題解 對於每個點,二分它右邊離他最遠 但是又在距離 k 內的點,然後加到答案裡,這樣做複雜度是nl ogn的,由於pretest太水,...
題解 CF1485 簡要題解
奇怪的難度。當 b 2 的時候再操作,操作次數是一定的。因此 b 的變化量很小,暴力列舉。考慮哪個數不同,然後不同後可以選擇的區間是什麼。會發現中間夾著的區間選兩遍,旁邊的選一遍。做字首和好了。簡單轉化發現一定要滿足 a k b 1 k。列舉 b 貢獻式帶有乙個 min 找到其分割點,前一部分直接求...
走迷宮 簡要題解
走迷宮,帶起點終點 有傳送門,傳送門個數不超過 26 個 不會 我們可以考慮把每個點能到的點連邊 二維壓到一維,常見 trick 於是我們有乙個很顯然的想法 點到傳送門連 0 權值的邊 但是這樣是錯的,因為我們經過傳送門必須得進去 紅色是邊,藍色是最短路 於是如果乙個點能到傳送門,我們就直接把傳送門...