赛氪OJ-专注于算法竞赛的在线评测系统 (saikr.com) 题目的这个公式有点像二进制
但是这里不是2进制。
题目说了m是n+1进制下的结果。我们只需要求一下给定的m在n+1进制下的值就可以了。
#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();
}
}
#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();
}
}