2023年算法精英大赛C题 多项式还原 题型:数学

107 阅读2分钟

赛氪OJ-专注于算法竞赛的在线评测系统 (saikr.com) 题目的这个公式有点像二进制 20+21+22+23+2^0+2^1+2^2+2^3+……

但是这里不是2进制。

题目说了m是n+1进制下的结果。我们只需要求一下给定的m在n+1进制下的值就可以了。 image.png

#include<bits/stdc++.h> 
using namespace std;
#define int long long
int n,m;
int x;  //系数 
int y;  //指数 
void sovel()
{
	cin>>n>>m;
	stack<pair<int,int> > q;
	y=0;
	while(m)
	{
	    x=m%(n+1);
		m/=n+1;
		if(x)
		{
			q.push({x,y});
		}
		y++;
	}
	int p=0;
	while(!q.empty())
	{
		if(p) //除了第一轮和最后一轮不输出+号,之后每一轮都输出
		{
			cout<<'+';
		}
		p=1;
		auto[x,y]=q.top();

     //如果系数不为1就输出系数,如果指数不为1就输出指数。
    //如果系数为0就输出指数,如果指数为0就输出系数
		if(y==0)
		{
			cout<<x;
			break;
		}
		if(x!=1)
		{
			cout<<x;
		}
		cout<<'x';
		if(y!=1)
		{
			cout<<'^'<<y;
		}
		q.pop();
	}
}
signed main()
{
	cin.tie(nullptr)->sync_with_stdio(false);
    int t=1;
    
//	cin>>t;
	while(t--)
	{
		sovel();
	 } 
}

image.png

#include<bits/stdc++.h> 
using namespace std;
#define int long long
#define pp pair<pair<int,int>,int>
const int N = 2e7 + 10;
const int M = 27;
const int mo = 1e9 + 7;
int n, m, x, y, z, k, val, o[20][20], p[20][20], sum = 0, manx;
int xx[4] = { 0,0,1,-1 };
int yy[4] = { 1,-1,0,0 };
void dfs()
{
	manx = max(manx, sum);
	stack<pp> q;
	for (int i = n; i >= 1; i--)
	{
		for (int j = 1; j <= m; j++)
		{
			p[i][j] = 0;
			if (i != n && o[i + 1][j] == 0)
			{
				x = i;
				while (x + 1 <= n && o[x + 1][j] == 0)
				{
					x++;
				}
				o[x][j] = o[i][j];
				o[i][j] = 0;
				q.push({ {x,i},j });
			}
		}
	}

	int len = 0;
	vector<vector<pair<int, int> > > v(25);
	for (int i = n; i >= 1; i--)
	{
		for (int j = 1; j <= m; j++)
		{
			queue<pair<int, int> > qu;
			if (p[i][j] == 0 && o[i][j])
			{
				len++;
				p[i][j] = len;
				qu.push({ i,j });
				while (!qu.empty())
				{
					auto [x, y] = qu.front();
					v[len].push_back({ x,y });
					qu.pop();
					for (int k = 0; k < 4; k++)
					{
						int xl = xx[k] + x;
						int yl = yy[k] + y;
						if (p[xl][yl] || o[xl][yl] != o[i][j])
						{
							continue;
						}
						p[xl][yl] = len;
						qu.push({ xl,yl });
					}
				}
			}
		}
	}
	for (int i = 1; i <= len; i++)
	{
		if (v[i].size() >= 3)
		{

			int z;
			for (auto [x, y] : v[i])
			{

				z = o[x][y];
				o[x][y] = 0;
				sum++;
			}
			dfs();
			for (auto [x, y] : v[i])
			{
				sum--;
				o[x][y] = z;
			}
		}
	}

	while (!q.empty())
	{
		auto [xl, y] = q.top();
		o[xl.second][y] = o[xl.first][y];
		q.pop();
	}
}
void sovel()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			cin >> o[i][j];
		}
	}

	dfs();
	cout << manx;
}
signed main()
{
	cin.tie(nullptr)->sync_with_stdio(false);
	int t = 1;

	//	cin>>t;
	while (t--)
	{
		sovel();
	}
}