解题报告: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;
}