解题报告:double能储存300位的数,真香。不会大数gg。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<vector>
#include<queue>
#include<set>
#define IL inline
#define x first
#define y second
typedef long long ll;
using namespace std;
double f[110];
double s[110];
int main()
{
double a;
int n;
f[1]=1;
for(int i=2;i<=100;i++)
{
f[i]=2*f[i-1]+1;
}
for(int i=1;i<=100;i++)
s[i]=s[i-1]+f[i];
cin>>n;
cin>>a;
//cout<<s[2]<<endl;
a=a+s[n];
//cout<<s[n]<<endl;
cout<<(int)(a/(pow(2,n+1)-1))<<endl;
return 0;
}
解题报告:思路就是dfs每一层的最左侧的是A还是B,然后判断这个构成的方阵能否满足题目意思。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<vector>
#include<queue>
#include<set>
#define IL inline
#define x first
#define y second
typedef long long ll;
using namespace std;
const int N=1000;
int n,m;
int cnt;
int ans;
char s[1000];
int row;
bool check(char *s)
{
char str[100][100];
for(int i=1;i<=row;i++)
{
str[i][1]=s[i];
}
for(int i=2;i<=row;i++)
for(int j=2;j<=i;j++)
{
if(str[i][j-1]=='A'&&str[i-1][j-1]=='A') str[i][j]='A';
if(str[i][j-1]=='A'&&str[i-1][j-1]=='B') str[i][j]='B';
if(str[i][j-1]=='B'&&str[i-1][j-1]=='A') str[i][j]='B';
if(str[i][j-1]=='B'&&str[i-1][j-1]=='B') str[i][j]='A';
}
int na=0,nb=0;
for(int i=1;i<=row;i++)
for(int j=1;j<=i;j++)
{
if(str[i][j]=='A') na++;
else nb++;
}
if(na==n&&nb==m) return 1;
else
return false;
}
void dfs(int u)
{
if(u==row+1)
{
if(check(s))
ans++;
return ;
}
s[u]='A';
dfs(u+1);
s[u]='B';
dfs(u+1);
}
int main()
{
cin>>n>>m;
int sum=n+m;
int temp=0;
for(int i=1;;i++)
{
temp+=i;
if(temp>=sum)
{
row=i;
break;
}
}
dfs(1);
cout<<ans<<endl;
return 0;
}