Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- typedef long double ld;
- ld dp[20][1<<18],ans[20][111],p;
- bool vis[20][1<<18];
- int num[1<<18];
- ld solve(int n,int mask){
- if(num[mask]>=n)return 0;
- if(vis[n][mask])return dp[n][mask];
- dp[n][mask]=0;
- vis[n][mask]=1;
- //2
- int nmask=mask+1;
- dp[n][mask]=(1-p)*(solve(n,nmask)+2*((mask^nmask)-1));
- //4
- if(mask%2){
- dp[n][mask]+=p*(solve(n-num[mask],2));
- }
- else {
- nmask=mask+2;
- dp[n][mask]+=p*(solve(n,nmask)+2*((mask^nmask)-2));
- }
- return dp[n][mask];
- }
- void all(){
- for(int i=0;i<=100;++i){
- p=i;p/=100;
- memset(vis,0,sizeof vis);
- for(int n=1;n<17;++n){
- for(int j=2*(1<<n)-1;j>0;--j)solve(n,j);
- ans[n][i]=solve(n,0);
- }
- }
- }
- int main()
- {
- for(int i=0;i<(1<<18);++i)num[i]=__builtin_popcount(i);
- all();
- int t;
- cin>>t;
- while(t--){
- int n,x;
- cin>>n>>x;
- cout<<setprecision(6)<<fixed<<ans[n][x]<<endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment