本地小黑板,学习不迷路

禁鼠标点击
禁复制
禁剪切
禁粘贴

使用快捷键 ctrl+f ,然后搜索“题目名”,可以快速找到你需要的题目

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int n,p,c,head[1010],k=0,f[1010],v[1010],sum[1010],ans=2e9+10;
//sum[i]表示牧场i有多少头牛 
struct node{
	int to,v,nxt;
}a[3010];
void add(int x,int y,int z){
	k++;a[k]={y,z,head[x]};head[x]=k; 
}
void dij(int s){ //计算起点s的最短路 
	priority_queue<pair<int,int> > q; //存<距离,结点编号> 
	q.push({0,s}); //起点入队 <距离0,编号s>
	while(q.size()){
		int x=q.top().second; //起点的编号
		q.pop(); //起点出队
		if(v[x]) continue;
		v[x]=1; //确定点x的最短路,并且用x松弛
		for(int i=head[x];i;i=a[i].nxt){ //遍历x可以到达的所有边 
			int to=a[i].to, w=a[i].v;
			if(f[x]+w<f[to]){ //松弛操作 
				f[to]=f[x]+w;
				q.push({-f[to],to});  //起点到to的距离和编号入队 
			} 
		} 
	} 
}
int main(){
	cin>>n>>p>>c;
	for(int i=1;i<=n;i++){
		int x;cin>>x;
		sum[x]++; //统计牧场x有多少头牛 
	} 
	for(int i=1;i<=c;i++){
		int x,y,z;
		cin>>x>>y>>z;
		add(x,y,z);add(y,x,z); //无向图,双向建边 
	} 
	for(int i=1;i<=p;i++){ //枚举每个牧场作为起点
		memset(f,0x3f,sizeof f); 
		memset(v,0,sizeof v);
		f[i]=0; //起点到起点的最短路为0 
		dij(i); //以i为起点,计算最短路 
		int dis=0;
		for(int j=1;j<=p;j++) dis+=sum[j]*f[j]; //牧场i的牛数*距离 
		ans=min(ans,dis); 
	} 
	cout<<ans;
	return 0;
}

/*	Problem: 香甜的黄油
	Language: C++	Result: 正确 	Time: 2026-10-10 21:01:33
	User: admin  	Problem: 1774	contest_id: 1184*/
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int n,p,c,head[1010],k=0,f[1010],v[1010],sum[1010],ans=2e9+10;
//sum[i]表示牧场i有多少头牛 
struct node{
	int to,v,nxt;
}a[3010];
void add(int x,int y,int z){
	k++;a[k]={y,z,head[x]};head[x]=k; 
}
void dij(int s){ //计算起点s的最短路 
	priority_queue<pair<int,int> > q; //存<距离,结点编号> 
	q.push({0,s}); //起点入队 <距离0,编号s>
	while(q.size()){
		int x=q.top().second; //起点的编号
		q.pop(); //起点出队
		if(v[x]) continue;
		v[x]=1; //确定点x的最短路,并且用x松弛
		for(int i=head[x];i;i=a[i].nxt){ //遍历x可以到达的所有边 
			int to=a[i].to, w=a[i].v;
			if(f[x]+w<f[to]){ //松弛操作 
				f[to]=f[x]+w;
				if(v[to]==0){
					q.push({-f[to],to});  //起点到to的距离和编号入队 
				}
			} 
		} 
	} 
}
int main(){
	cin>>n>>p>>c;
	for(int i=1;i<=n;i++){
		int x;cin>>x;
		sum[x]++; //统计牧场x有多少头牛 
	} 
	for(int i=1;i<=c;i++){
		int x,y,z;
		cin>>x>>y>>z;
		add(x,y,z);add(y,x,z); //无向图,双向建边 
	} 
	for(int i=1;i<=p;i++){ //枚举每个牧场作为起点
		memset(f,0x3f,sizeof f); 
		memset(v,0,sizeof v);
		f[i]=0; //起点到起点的最短路为0 
		dij(i); //以i为起点,计算最短路 
		int dis=0;
		for(int j=1;j<=p;j++) dis+=sum[j]*f[j]; //牧场i的牛数*距离 
		ans=min(ans,dis); 
	} 
	cout<<ans;
	return 0;
}

/*	Problem: 香甜的黄油
	Language: C++	Result: 正确 	Time: 2026-10-10 20:59:57
	User: admin  	Problem: 1774	contest_id: 1184*/
#include<iostream>
#include<cstring>
using namespace std;
int n,m,s,e,ans=0,head[2510],k=0,f[2510],v[2510];//邻接表:链式前向星 
//f[i]表示起点到i的最短路,v[i]=1表示起点到i的最短路已经确定
//a[i][j]表示结点i和结点j之间的路径长度 
struct node{
	int to,v,nxt; 
}a[20010];
void add(int x,int y,int z){
	k++,a[k]={y,z,head[x]},head[x]=k;  //e[k].to=y,e[k].v=z,e[k].nxt=head[x]
}
void diskstra(){
	for(int i=1;i<=n;i++){ //确定n次最短距离 
		int mi=0,minn=0x3f3f3f3f;
		for(int j=1;j<=n;j++){
			if(!v[j]&&f[j]<minn){ //在没有被确定最短路的结点里面,打擂台找最短距离 
				mi=j;
				minn=f[j];
			}
		} 
		if(mi) v[mi]=1; //结点mi的最短路被确定
		for(int j=head[mi];j;j=a[j].nxt){ //使用mi进行松弛操作
			int to=a[j].to; 
			if(!v[to]&&a[j].v){
				f[to]=min(f[to],f[mi]+a[j].v); //松弛操作:使用起点到mi的最短路 更新 起点到j的最短路 
			} 
		} 
	}
} 
int main(){
	cin>>n>>m>>s>>e;
	for(int i=1;i<=m;i++){
		int x,y,z; cin>>x>>y>>z;
		add(x,y,z);
		add(y,x,z);//无向图,双向建边 
	}
	memset(f,0x3f,sizeof f); //起点到每个点的初始距离为无穷大,表示不可到达
	f[s]=0; //起点到起点的距离初始化为0
	diskstra();
	cout<<f[e]; //输出s到e的最短路 
	return 0;
}
/*
单源最短路:无负环 
*/

/*	Problem: 热浪
	Language: C++	Result: 正确 	Time: 2026-10-10 20:10:52
	User: admin  	Problem: 1367	contest_id: 1184*/
#include<iostream>
#include<cstring>
using namespace std;
int n,m,s,e,ans=0,a[2510][2510],f[2510],v[2510];//邻接矩阵 
//f[i]表示起点到i的最短路,v[i]=1表示起点到i的最短路已经确定
//a[i][j]表示结点i和结点j之间的路径长度 
void diskstra(){
	for(int i=1;i<=n;i++){ //确定n次最短距离 
		int mi=0,minn=0x3f3f3f3f;
		for(int j=1;j<=n;j++){
			if(!v[j]&&f[j]<minn){ //在没有被确定最短路的结点里面,打擂台找最短距离 
				mi=j;
				minn=f[j];
			}
		} 
		if(mi) v[mi]=1; //结点mi的最短路被确定
		for(int j=1;j<=n;j++){ //使用mi进行松弛操作 
			if(!v[j]&&a[mi][j]){
				f[j]=min(f[j],f[mi]+a[mi][j]); //松弛操作:使用起点到mi的最短路 更新 起点到j的最短路 
			} 
		} 
	}
} 
int main(){
	cin>>n>>m>>s>>e;
	for(int i=1;i<=m;i++){
		int x,y,z; cin>>x>>y>>z;
		a[x][y]=z;
		a[y][x]=z; //无向图,双向建边 
	}
	memset(f,0x3f,sizeof f); //起点到每个点的初始距离为无穷大,表示不可到达
	f[s]=0; //起点到起点的距离初始化为0
	diskstra();
	cout<<f[e]; //输出s到e的最短路 
	return 0;
}
/*
单源最短路:无负环 
*/

/*	Problem: 热浪
	Language: C++	Result: 正确 	Time: 2026-10-10 19:37:19
	User: admin  	Problem: 1367	contest_id: 1184*/
#include <string>
#include <iostream>
using namespace std;
int main() {  //注意:替换ans中的字符ABCD,不要空格,不要写错了答案顺序
	string ans =
	"BCBAB"
	"BCDAB"
	"AACDD"
	"AABAB"
	"AABAA";
	int no;
	cin>>no;
	cout<<ans[no - 1];
	return 0;
}
/*	Problem: 选择题判断题8
	Language: C++	Result: 正确 	Time: 2026-10-08 18:12:34
	User: admin  	Problem: 5162	contest_id: 0*/
#include <string>
#include <iostream>
using namespace std;
int main() {  //注意:替换ans中的字符ABCD,不要空格,不要写错了答案顺序
	string ans =
	"CDCBA"
	"BADCB"
	"ADDBC"
	"ABBAA"
	"BABAB";
	int no;
	cin>>no;
	cout<<ans[no - 1];
	return 0;
}
/*	Problem: 选择题判断题7
	Language: C++	Result: 正确 	Time: 2026-10-08 18:10:24
	User: admin  	Problem: 5161	contest_id: 0*/
#include <string>
#include <iostream>
using namespace std;
int main() {  //注意:替换ans中的字符ABCD,不要空格,不要写错了答案顺序
	string ans =
	"BACBC"
	"BADCB"
	"BCBCA"
	"BBBAA"
	"AABAB";
	int no;
	cin>>no;
	cout<<ans[no - 1];
	return 0;
}
/*	Problem: 选择题判断题6
	Language: C++	Result: 正确 	Time: 2026-10-08 18:08:05
	User: admin  	Problem: 5160	contest_id: 0*/
#include <string>
#include <iostream>
using namespace std;

int main() {  //注意:替换ans中的字符ABCD,不要空格,不要写错了答案顺序
	string ans =
	"ACBCD"
	"BADCB"
	"DADCC"
	"ABAAB"
	"ABABB";
	int no;
	cin>>no;
	cout<<ans[no - 1];
	return 0;
}
/*	Problem: 选择题判断题5
	Language: C++	Result: 正确 	Time: 2026-10-08 18:05:31
	User: admin  	Problem: 5159	contest_id: 0*/
#include <string>
#include <iostream>
using namespace std;

int main() {  //注意:替换ans中的字符ABCD,不要空格,不要写错了答案顺序
	string ans =
	"CBBCA"
	"DCCCC"
	"BDBCA"
	"ABABA"
	"BABAB";
	int no;
	cin>>no;
	cout<<ans[no - 1];
	return 0;
}
/*	Problem: 选择题判断题4
	Language: C++	Result: 正确 	Time: 2026-10-08 18:02:09
	User: admin  	Problem: 5158	contest_id: 0*/
#include <string>
#include <iostream>
using namespace std;

int main() {  //注意:替换ans中的字符ABCD,不要空格,不要写错了答案顺序
	string ans =
	"DDACB"
	"CDCAA"
	"DCDBB"
	"BBBBB"
	"BBAAB";
	int no;
	cin>>no;
	cout<<ans[no - 1];
	return 0;
}
/*	Problem: 选择题判断题3
	Language: C++	Result: 正确 	Time: 2026-10-08 17:59:31
	User: admin  	Problem: 5157	contest_id: 0*/
#include <string>
#include <iostream>
using namespace std;

int main() {  //注意:替换ans中的字符ABCD,不要空格,不要写错了答案顺序
	string ans =
	"CBADA"
	"CBDBD"
	"DCAAA"
	"AABBB"
	"ABABB";
	int no;
	cin>>no;
	cout<<ans[no - 1];
	return 0;
}
/*	Problem: 选择题判断题2
	Language: C++	Result: 正确 	Time: 2026-10-08 17:56:41
	User: admin  	Problem: 5156	contest_id: 0*/
#include <string>
#include <iostream>
using namespace std;

int main() {  //注意:替换ans中的字符ABCD,不要空格,不要写错了答案顺序
	string ans =
	"CDAAB"
	"CDACD"
	"DBAAD"
	"ABBAA"
	"AABBB";
	int no;
	cin>>no;
	cout<<ans[no - 1];
	return 0;
}
/*	Problem: 选择题判断题1
	Language: C++	Result: 正确 	Time: 2026-10-08 17:52:00
	User: admin  	Problem: 5155	contest_id: 0*/
#include <string>
#include <iostream>
using namespace std;

int main() {  //注意:替换ans中的字符ABCD,不要空格,不要写错了答案顺序
	string ans =
	"BBCAC"
	"DAADA"
	"CBBCD"
	"AABBA"
	"BAABA";
	int no;
	cin>>no;
	cout<<ans[no - 1];
	return 0;
}
/*	Problem: 选择题判断题8
	Language: C++	Result: 正确 	Time: 2026-10-08 14:35:42
	User: admin  	Problem: 4886	contest_id: 0*/
#include <string>
#include <iostream>
using namespace std;

int main() {  //注意:替换ans中的字符ABCD,不要空格,不要写错了答案顺序
	string ans =
	"BACDC"
	"CDAAC"
	"DBBBD"
	"BBBAB"
	"AABAA";
	int no;
	cin>>no;
	cout<<ans[no - 1];
	return 0;
}
/*	Problem: 选择题判断题7
	Language: C++	Result: 正确 	Time: 2026-10-08 14:27:27
	User: admin  	Problem: 4885	contest_id: 0*/
#include <string>
#include <iostream>
using namespace std;

int main() {  //注意:替换ans中的字符ABCD,不要空格,不要写错了答案顺序
	string ans =
	"DBCAA"
	"BAABB"
	"DBABA"
	"BBBAB"
	"BABAA";
	int no;
	cin>>no;
	cout<<ans[no - 1];
	return 0;
}
/*	Problem: 选择题判断题6
	Language: C++	Result: 正确 	Time: 2026-10-08 14:21:55
	User: admin  	Problem: 4884	contest_id: 0*/
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;

const int N = 505;
const int E = 1005;
const int oo = 1e9;

int n, m;
int h[N], to[E], nx[E], l[E], t[E];
int d[N][N];
priority_queue<pair<int, int> > q;

void calc(int u, int d[]) {
    for (int i = 1; i <= n; i++)
        d[i] = -oo;
    d[u] = oo;
    q.push(make_pair(d[u], u));
    while (!q.empty()) {
        pair<int, int> p = q.top();
        q.pop();
        if (d[p.second] != p.first)
            continue;
        int u = p.second;
        for (int i = h[u]; i; i = nx[i]) {
            int v = to[i];
            int w = min(d[u] - t[i], l[i]);
            if (w < 0)
                continue;
            if (w > d[v]) {
                d[v] = w;
                q.push(make_pair(d[v], v));
            }
        }
    }
}

int main() {
    int q;
    scanf("%d%d%d", &n, &m, &q);
    for (int i = 1; i <= m; i++) {
        int u, v;
        scanf("%d%d%d%d", &u, &v, &l[i], &t[i]);
        to[i] = u;
        nx[i] = h[v];
        h[v] = i;
    }
    for (int i = 1; i <= n; i++)
        calc(i, d[i]);
    while (q--) {
        int u, v, s;
        scanf("%d%d%d", &u, &v, &s);
        if (s <= d[v][u])
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

/*	Problem: 末班车
	Language: C++	Result: 正确 	Time: 2026-10-08 09:36:07
	User: admin  	Problem: 5154	contest_id: 0*/
#include <cstdio>
#include <algorithm>
using namespace std;

const int N = 1e5 + 5;
const int E = N << 1;
const int mod = 998244353;

int n, m;
int h[N], to[E], nx[E], et;
int d[N];
int ans;

void ae(int u, int v) {
    to[++et] = v;
    nx[et] = h[u];
    h[u] = et;
}

void dfs(int u, int p=0) {
    d[u] = d[p] + 1;
    for (int i = h[u]; i; i = nx[i]) {
        int v = to[i];
        if (v == p)
            continue;
        if (!d[v])
            dfs(v, u);
        if (d[v] < d[u])
            ans = 1ll * ans * (d[u] - d[v] + 1) % mod;
    }
}

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= m; i++) {
        int u, v;
        scanf("%d%d", &u, &v);
        ae(u, v);
        ae(v, u);
    }
    ans = 1;
    dfs(1);
    printf("%d\n", ans);
    return 0;
}

/*	Problem: 生成树计数
	Language: C++	Result: 正确 	Time: 2026-10-08 09:36:06
	User: admin  	Problem: 5153	contest_id: 0*/
#include <cstdio>
#include <algorithm>
using namespace std;

const int N = 2005;
const int mod = 1e9;

int n;
char s[N];
int f[N][N];

int main() {
    scanf("%d", &n);
    scanf("%s", s + 1);
    f[0][0] = 1;
    for (int i = 1; i <= n; i++)
        for (int j = 0; j <= n; j++) {
            f[i][j] = f[i - 1][j];
            if (s[i] == '(' && j)
                f[i][j] = (f[i][j] + f[i - 1][j - 1]) % mod;
            if (s[i] == ')' && j < n)
                f[i][j] = (f[i][j] + f[i - 1][j + 1]) % mod;
        }
    printf("%d\n", f[n][0]);
    return 0;
}

/*	Problem: 括号序列2
	Language: C++	Result: 正确 	Time: 2026-10-08 09:36:06
	User: admin  	Problem: 5152	contest_id: 0*/
#include <cstdio>
#include <algorithm>
using namespace std;

const int N = 1005;
const int E = 2005;

int n, m;
int h[N], to[E], nx[E], et;
int id[N], od[N];
bool vis[N];
int q[N], ql, qr;
int ans[N], cnt;

bool chk(int ban) {
    ql = qr = 0;
    for (int i = 1; i <= n; i++) {
        vis[i] = (i == ban);
        if (!vis[i] && !id[i]) {
            q[++qr] = i;
            vis[i] = 1;
        }
    }
    while (ql < qr) {
        int u = q[++ql];
        for (int i = h[u]; i; i = nx[i]) {
            int v = to[i];
            if (vis[v])
                continue;
            if (!od[v])
                return 0;
            q[++qr] = v;
            vis[v] = 1;
        }
    }
    return 1;
}

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= m; i++) {
        int u, v;
        scanf("%d%d", &u, &v);
        to[++et] = v;
        nx[et] = h[u];
        h[u] = et;
        od[u]++;
        id[v]++;
    }
    for (int i = 1; i <= n; i++)
        if (chk(i))
            ans[++cnt] = i;
    printf("%d\n", cnt);
    for (int i = 1; i <= cnt; i++)
        printf("%d%c", ans[i], " \n"[i == cnt]);
    return 0;
}

/*	Problem: 必经之路
	Language: C++	Result: 正确 	Time: 2026-10-08 09:36:05
	User: admin  	Problem: 5151	contest_id: 0*/
#include <cstdio>
#include <algorithm>
using namespace std;

const int N = 2e4 + 5;
const int E = N << 1;

int n;
int h[N], to[E], nx[E], et;
int ans;

void ae(int u, int v) {
    et++;
    to[et] = v;
    nx[et] = h[u];
    h[u] = et;
}

int dfs(int u, int p=0) {
    int sz = 1;
    for (int i = h[u]; i; i = nx[i])
        if (to[i] != p)
            sz += dfs(to[i], u);
    ans = min(ans, abs(n - 2 * sz));
    return sz;
}

int main() {
    scanf("%d", &n);
    for (int i = 1; i < n; i++) {
        int u, v;
        scanf("%d%d", &u, &v);
        ae(u, v);
        ae(v, u);
    }
    ans = n;
    dfs(1);
    printf("%d\n", ans);
    return 0;
}

/*	Problem: 分树规划
	Language: C++	Result: 正确 	Time: 2026-10-08 09:36:05
	User: admin  	Problem: 5150	contest_id: 0*/
#include <cstdio>
#include <algorithm>
using namespace std;

const int N = 2005;
const long long oo = 1e18;

int n;
int a[N], pre[N];
long long f[N];

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
        pre[i] = pre[i - 1] + a[i];
    }
    for (int i = 1; i <= n; i++) {
        f[i] = oo;
        for (int j = 0; j < i; j++)
            f[i] = min(f[i], f[j] + 1ll * (pre[i] - pre[j]) * (pre[i] - pre[j]));
    }
    printf("%lld\n", f[n]);
    return 0;
}

/*	Problem: 数组划分2
	Language: C++	Result: 正确 	Time: 2026-10-08 09:36:05
	User: admin  	Problem: 5149	contest_id: 0*/
#include <cstdio>
#include <algorithm>
using namespace std;

const int N = 2005;

int n, t;
int v[N], s[N], p[N];
double ans;

bool cmp(int x, int y) {
    return s[x] < s[y];
}

int main() {
    scanf("%d%d", &n, &t);
    for (int i = 1; i <= n; i++) {
        scanf("%d%d", &v[i], &s[i]);
        p[i] = i;
    }
    sort(p + 1, p + n + 1, cmp);
    int ss = 0, sv = 0;
    for (int i = 1; i <= n; i++) {
        int cv = v[p[i]], cs = s[p[i]];
        if (ss + cs * cv > t * (sv + cv)) {
            double k = (double)(t * sv - ss) / (cs - t);
            ans = max(ans, sv + k);
            break;
        }
        ss += cs * cv;
        sv += cv;
    }
    if (ss == sv * t) ans = max(ans, (double) sv);
    sv = ss = 0;
    for (int i = n; i >= 1; i--) {
        int cv = v[p[i]], cs = s[p[i]];
        if (ss + cs * cv < t * (sv + cv)) {
            double k = (double)(t * sv - ss) / (cs - t);
            ans = max(ans, sv + k);
            break;
        }
        ss += cs * cv;
        sv += cv;
    }
    if (ss == sv * t) ans = max(ans, (double) sv);
    printf("%.3lf\n", ans);
    return 0;
}

/*	Problem: 饮品调制
	Language: C++	Result: 正确 	Time: 2026-10-08 09:36:05
	User: admin  	Problem: 5148	contest_id: 0*/
#include <cstdio>
using namespace std;

int n, ans;

bool not_prime[1000005];
int primes[500000], pcnt = 0;

void get_primes() {
    not_prime[1] = true;
    for (int i = 2; i <= n; ++i) {
        if (!not_prime[i]) {
            primes[pcnt++] = i;
            for (int j = 2; i * j <= n; ++j) {
                not_prime[i * j] = true;
            }
        }
    }
}

int main() {
    scanf("%d", &n);
    get_primes();
    for (int i = 0; i < pcnt && primes[i] <= n / 2; ++i)
        if (!not_prime[n - primes[i]])
            ans++;
    printf("%d\n", ans);
    return 0;
}

/*	Problem: 哥德巴赫猜想2
	Language: C++	Result: 正确 	Time: 2026-10-08 09:36:05
	User: admin  	Problem: 5147	contest_id: 0*/
#include <cstdio>
#include <algorithm>
using namespace std;

const int N = 15;

int n, m;
int a[N][N];

void sort_row(int n) {
    for (int i = 1; i <= m; i++)
        for (int j = 1; j < m; j++)
            if (a[n][j] > a[n][j + 1]) {
                int tmp = a[n][j];
                a[n][j] = a[n][j + 1];
                a[n][j + 1] = tmp;
            }
    return;
}

void sort_col(int m) {
    for (int i = 1; i <= n; i++)
        for (int j = 1; j < n; j++)
            if (a[j][m] > a[j + 1][m]) {
                int tmp = a[j][m];
                a[j][m] = a[j + 1][m];
                a[j + 1][m] = tmp;
            }
    return;
}

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            scanf("%d", &a[i][j]);
    for (int i = 1; i <= n; i++)
        sort_row(i);
    for (int i = 1; i <= m; i++)
        sort_col(i);
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            printf("%d%c", a[i][j], " \n"[j == m]);
    return 0;
}

/*	Problem: 有序网格
	Language: C++	Result: 正确 	Time: 2026-10-08 09:36:05
	User: admin  	Problem: 5146	contest_id: 0*/
#include <iostream>
using namespace std;

int f[22], g[22];

int main() {
    int n;
    cin >> n;

    for (int i = 1; i <= n; ++i) {
        f[i] = 2 * g[i - 1] + 1;
        g[i] = 2 * g[i - 1] + f[i - 1] + 2;
    }

    cout << g[n] << endl;
    return 0;
}

/*	Problem: 新汉诺塔
	Language: C++	Result: 正确 	Time: 2026-10-08 09:36:05
	User: admin  	Problem: 5145	contest_id: 0*/
#include <iostream>
#include <string>
using namespace std;

int main() {
    string s = "";
    getline(cin, s);

    for (int k = 1;; ++k) {
        string spaces = "";
        for (int i = 0; i < k; ++i) {
            spaces += " ";
        }

        int pos = s.find(spaces);
        if (pos < 0 || pos >= s.size()) break;

        for (int i = 0; i < pos; ++i) {
            cout << s[i];
        }
        cout << endl;

        string rest = "";
        for (int i = pos + k; i < s.length(); ++i) {
            rest += s[i];
        }
        s = rest;
    }

    cout << s << endl;
    return 0;
}

/*	Problem: 分割字符串
	Language: C++	Result: 正确 	Time: 2026-10-08 09:36:05
	User: admin  	Problem: 5144	contest_id: 0*/
#include <iostream>
using namespace std;

int a[20010];

int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i)
        cin >> a[i];
    int S = a[0];
    for (int i = 1; i < n; ++i)
        S &= a[i];
    int ans = 0;
    while (S > 0) {
        if (S & 1) ans++;
        S >>= 1;
    }
    cout << ans;
    return 0;
}

/*	Problem: 公共二进制位
	Language: C++	Result: 正确 	Time: 2026-10-08 09:36:04
	User: admin  	Problem: 5143	contest_id: 0*/
#include <iostream>
using namespace std;

int main() {
    int a, b, c, p = 0;
    cin >> a >> b >> c;
    for (int i = 1; i <= 8; ++i) {
        for (int j = 1; j <= 16; ++j) {
            ++p;
            if (p == a)
                cout << (char)a;
            else if (p == b)
                cout << (char)b;
            else if (p == c)
                cout << (char)c;
            else
                cout << '*';
        }
        cout << '\n';
    }
    return 0;
}

/*	Problem: 字符变换
	Language: C++	Result: 正确 	Time: 2026-10-08 09:36:04
	User: admin  	Problem: 5142	contest_id: 0*/
#include <iostream>
#include <cmath>
using namespace std;

int main() {
    double a, b, U;
    cin >> a >> b >> U;
    int ans = 1;
    if (a <= U) ans++;
    while (b <= U) {
        ans++;
        double t = sqrt(a * a + b * b);
        a = b, b = t;
    }
    cout << ans << endl;
    return 0;
}

/*	Problem: 直角三角形2
	Language: C++	Result: 正确 	Time: 2026-10-08 09:36:04
	User: admin  	Problem: 5141	contest_id: 0*/
#include <cstdio>
#include <algorithm>
using namespace std;

int n;
long long f, ans;

int main() {
    scanf("%d", &n);
    f = 1;
    for (int i = 1; i <= n; i++) {
        ans += f;
        f *= 2;
    }
    printf("%lld\n", ans);
    return 0;
}

/*	Problem: 棋盘上的奖赏
	Language: C++	Result: 正确 	Time: 2026-10-08 09:36:04
	User: admin  	Problem: 5140	contest_id: 0*/
#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    float t1, v, t2;
    cin >> t1 >> v >> t2;
    float tt = 1000.0 / v + t2;
    if (tt < t1)
        printf("rabbit\n");
    else if (tt > t1)
        printf("turtle\n");
    else
        printf("tie\n");
    printf("%.2f\n", tt);
    return 0;
}

/*	Problem: 新龟兔赛跑
	Language: C++	Result: 正确 	Time: 2026-10-08 09:36:04
	User: admin  	Problem: 5139	contest_id: 0*/
#include<iostream>
using namespace std;
long long n,a[200010],b[200010],f[200010];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) cin>>b[i];
	for(int i=n;i;i--){ //从后往前推 
		f[i]=max(a[i]+f[i+max(1ll,b[i])],f[i+1]); 
	}
	cout<<f[1]; //答案 
	return 0;
}
/*
f[i]表示从n-i选数字的最大得分之和,不见得一定选择了ai 
状态转移:f[i]=max(a[i]+f[i+b[i]],f[i+1]); 
*/

/*	Problem: 选数
	Language: C++	Result: 正确 	Time: 2026-10-07 11:24:15
	User: admin  	Problem: 4858	contest_id: 0*/
#include<iostream>
using namespace std;
long long n,f[100010],a[100010];
string s; 
//f[i]表示前i个字符划分后的最大价值 
int main(){
	cin>>n>>s;
	s=" "+s;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++){
		int cnt=0; 
		for(int j=i;j>=1;j--){
			int x=1<<(s[j]-'a'); //s[j]占用第x位的二进制数字 
			if(cnt&x) break; //字符s[j]出现过 
			cnt|=x; //状态压缩,用二进制记录哪个字符出现过 
			f[i]=max(f[i],f[j-1]+a[i-j+1]); //状态转移 
		}
	}
	cout<<f[n]; 
	return 0;
}
/*	Problem: 划分字符串
	Language: C++	Result: 正确 	Time: 2026-10-07 10:40:03
	User: admin  	Problem: 4505	contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0,f[1010],a[1010];
//f[i]表示前i个人的最大积极性之和 
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i],f[i]=a[i];//初始化 
	for(int i=1;i<=n;i++){
		for(int j=1;j<i;j++){ //状态转移 
			f[i]=max(f[i],f[j]+a[i-j]);
		}
	}
	cout<<f[n];//答案 
	return 0;
}
/*	Problem: 学习小组
	Language: C++	Result: 正确 	Time: 2026-10-07 10:15:42
	User: admin  	Problem: 4465	contest_id: 0*/
#include<iostream>
using namespace std;
const long long MOD=1000000007;
long long n,a,b,c,ans[200010];
//记忆化搜索:ans[i]表示数字i的方案数 
long long f(long long n){
	if(n<=c) return 1;
	if(ans[n]) return ans[n];
	ans[n]=(f(n-a)+f(n-b))%MOD;
	return ans[n];
}
int main(){
	cin>>n>>a>>b>>c;
	cout<<f(n);
	return 0;
}
/*	Problem: 游戏
	Language: C++	Result: 正确 	Time: 2026-10-07 09:59:03
	User: admin  	Problem: 4075	contest_id: 0*/
#include<iostream>
using namespace std;
const long long MOD=1000000007;
long long n,a,b,c,f[200010];
//状态定义:f[i]表示数字i的方案数 
int main(){
	cin>>n>>a>>b>>c;
	for(int i=0;i<=c;i++) f[i]=1; //状态初始值 
	for(int i=c+1;i<=n;i++){
		if(i>=a&&i>=b) f[i]=(f[i-a]+f[i-b])%MOD;
		else if(i>=a) f[i]=(f[i-a]+1)%MOD;
		else if(i>=b) f[i]=(f[i-b]+1)%MOD;
		else f[i]=2;
	} 
	cout<<f[n];
	return 0;
}
/*	Problem: 游戏
	Language: C++	Result: 正确 	Time: 2026-10-07 09:58:50
	User: admin  	Problem: 4075	contest_id: 0*/
#include<iostream>
using namespace std;
const long long MOD=1000000007;
long long n,a,b,c,ans[200010];
//记忆化搜索:ans[i]表示数字i的方案数 
long long f(long long n){
	if(ans[n]) return ans[n];
	if(n<=c) return 1;
	ans[n]=(f(n-a)+f(n-b))%MOD;
	return ans[n];
}
int main(){
	cin>>n>>a>>b>>c;
	cout<<f(n);
	return 0;
}
/*	Problem: 游戏
	Language: C++	Result: 正确 	Time: 2026-10-07 09:49:11
	User: admin  	Problem: 4075	contest_id: 0*/
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m,k,ans=0,f[1010];
//f[i]表示走到方块i时,已经穿越的方块最大数量(包括i)
struct node{
	int x,y;
}a[1010]; 
bool cmp(node n1,node n2){ //坐标小的排前面 
	if(n1.x==n2.x) n1.y<n2.y;
	return n1.x<n2.x;
} 
int main(){
	cin>>n>>m>>k;
	for(int i=1;i<=k;i++) cin>>a[i].x>>a[i].y;
	sort(a+1,a+k+1,cmp); //排序:确保状态转移时,能转移到i的j都在i前面 
	for(int i=1;i<=k;i++){ //从前往后遍历每个可穿越的方块
		f[i]=1; //自己可以穿越,初始值为1 
		for(int j=1;j<i;j++){ //方块i是否可以续在方块j的后面 
			if(a[i].y>a[j].y&&a[i].x>a[j].x){
				f[i]=max(f[i],f[j]+1);
			} 
		} 
		ans=max(ans,f[i]);//ans表示全程可以穿越的最大方块数量 
	} 
	int res=round(n*100+m*100-ans*(200-sqrt(20000)));
	cout<<res;
	return 0;
}

/*	Problem: 飞翔
	Language: C++	Result: 正确 	Time: 2026-10-06 16:52:29
	User: admin  	Problem: 1381	contest_id: 0*/
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
int n,ans=0,e=-1;
struct node{
	int s,t,id; //s达到时间,t吃草时间,id资历(数字小,资历老) 
	friend bool operator<(node n1,node n2){
		return n1.id>n2.id; //资历数字小的排前面(数字小,资历老) 
	}
}a[100010]; 
bool cmp(node n1,node n2){
	return n1.s<n2.s; //到达时间小的排前面 
} 
priority_queue<node> q; 
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].s>>a[i].t;
		a[i].id=i; //记录资历 
	}
	sort(a+1,a+n+1,cmp); //按照到达时间从小到大排序 
	for(int i=1;i<=n;i++){ //遍历每一头牛 
		if(a[i].s>e){ //第i头牛来的时候,前面吃草的结束了 
			if(q.empty()){ //队列没有牛等着 
				e=a[i].s+a[i].t; //更新吃草结束时间 
			}else{  //队列不为空 
				int wait=e-q.top().s; //队首的等待时间
				ans=max(ans,wait);
				e+=q.top().t;  //更新吃草结束时间
				q.pop(); //队首吃草了,出队
				
				i--; //e比a[i].s大很多,让队列里面的牛先吃,i现在不能入队 
			}
		}else{ //前面的还没有结束,入队等着 
			q.push(a[i]); //第i头牛入队等着 
		} 
	} 
	while(q.size()){ //队列里面还有牛 
		int wait=e-q.top().s; //队首的等待时间
		ans=max(ans,wait);
		e+=q.top().t;  //更新吃草结束时间
		q.pop(); //队首吃草了,出队 
	} 
	cout<<ans; 
	return 0;
}
/*	Problem: 资历
	Language: C++	Result: 正确 	Time: 2026-10-06 16:23:54
	User: admin  	Problem: 2541	contest_id: 0*/
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
int n,ans=0,e=-1;
struct node{
    int s,t,id; //s达到时间,t吃草时间,id资历(数字小,资历老) 
    friend bool operator<(node n1,node n2){
        return n1.id>n2.id; //资历数字小的排前面(数字小,资历老) 
    }
}a[100010]; 
bool cmp(node n1,node n2){
    return n1.s<n2.s; //到达时间小的排前面 
} 
priority_queue<node> q; 
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i].s>>a[i].t;
        a[i].id=i; //记录资历 
    }
    sort(a+1,a+n+1,cmp); //按照到达时间从小到大排序 
    for(int i=1;i<=n;i++){ //遍历每一头牛 
        if(a[i].s>e){ //第i头牛来的时候,前面吃草的结束了 
            if(q.empty()){ //队列没有牛等着 
                e=a[i].s+a[i].t; //更新吃草结束时间 
            }else{  //队列不为空 
                int wait=e-q.top().s; //队首的等待时间
                ans=max(ans,wait);
                e+=q.top().t;  //更新吃草结束时间
                q.pop(); //队首吃草了,出队
                 
                i--; //e比a[i].s大很多,让队列里面的牛先吃,i先等等 
            }
        }else{ //前面的还没有结束,入队等着 
            q.push(a[i]); //第i头牛入队等着 
        } 
    } 
    while(q.size()){ //队列里面还有牛 
        int wait=e-q.top().s; //队首的等待时间
        ans=max(ans,wait);
        e+=q.top().t;  //更新吃草结束时间
        q.pop(); //队首吃草了,出队 
    } 
    cout<<ans; 
    return 0;
}
/*	Problem: 资历
	Language: C++	Result: 正确 	Time: 2026-10-06 16:22:41
	User: admin  	Problem: 2541	contest_id: 0*/
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
int n,ans=0,e=-1;
struct node{
	int s,t,id; //s达到时间,t吃草时间,id资历(数字小,资历老) 
	friend bool operator<(node n1,node n2){
		return n1.id>n2.id; //资历数字小的排前面(数字小,资历老) 
	}
}a[100010]; 
bool cmp(node n1,node n2){
	return n1.s<n2.s; //到达时间小的排前面 
} 
priority_queue<node> q; 
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].s>>a[i].t;
		a[i].id=i; //记录资历 
	}
	sort(a+1,a+n+1,cmp); //按照到达时间从小到大排序 
	for(int i=1;i<=n;i++){ //遍历每一头牛 
		if(a[i].s>=e){ //第i头牛来的时候,前面吃草的结束了 
			if(q.empty()){ //队列没有牛等着 
				e=a[i].s+a[i].t; //更新吃草结束时间 
			}else{  //队列不为空 
				int wait=e-q.top().s; //队首的等待时间
				ans=max(ans,wait);
				e+=q.top().t;  //更新吃草结束时间
				q.pop(); //队首吃草了,出队
				
				if(e<a[i].s) i--; //e比a[i].s大很多,让队列里面的牛先吃
				else q.push(a[i]); //正好相等的时候才能进来 
			}
		}else{ //前面的还没有结束,入队等着 
			q.push(a[i]); //第i头牛入队等着 
		} 
	} 
	while(q.size()){ //队列里面还有牛 
		int wait=e-q.top().s; //队首的等待时间
		ans=max(ans,wait);
		e+=q.top().t;  //更新吃草结束时间
		q.pop(); //队首吃草了,出队 
	} 
	cout<<ans; 
	return 0;
}

/*	Problem: 资历
	Language: C++	Result: 正确 	Time: 2026-10-06 16:20:23
	User: admin  	Problem: 2541	contest_id: 0*/
#include<iostream>
#include<queue> 
using namespace std;
int n,k,b[1010],ans=0,mx;
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>b[i];
		mx=max(mx,b[i]); //某棵树的最大浆果数量 
	}
	for(int i=1;i<=mx;i++){//尝试每个篮子的最大值为i
		int cnt=0; //cnt表示装i个的篮子数量 
		priority_queue<int> q; //默认是大根堆,堆顶就是最大值 
		for(int j=1;j<=n;j++){ //遍历没棵树 
			cnt+=b[j]/i; 
			q.push(b[j]%i); //凑不满i个的余数入堆,万一凑不满k篮,则有用 
		} 
		//已经有了cnt篮,每篮i个 
		if(cnt<k/2) continue; //不够k/2篮,小西只能得到0个浆果 
		else if(cnt<k){ //需要从余数中凑满k篮
			int res=(cnt-k/2)*i;
			int t=k-cnt; //还要从余数中凑t篮
			while(q.size()&&t--){
				res+=q.top();
				q.pop();
			} 
			ans=max(ans,res); 
		}else{//超过k篮,直接取走k/2篮的浆果 
			ans=max(ans,k/2*i); 
		} 
	} 
	cout<<ans; 
	return 0;
}
/*
1 尝试每个篮子的最大值依次枚举i:从1~mx(mx表示最多的树的数量)
2 按照策略分配浆果,如果均分的不够,则用少于i个的水果(从大到小)补充剩余篮子 

在上述所有的方案里面,取后面K/2个篮子之和的最大值 
*/

/*	Problem: 采浆果
	Language: C++	Result: 正确 	Time: 2026-10-06 15:29:35
	User: admin  	Problem: 2552	contest_id: 0*/
#include<iostream>
#include<queue>
#include<algorithm> 
using namespace std;
int n,ans=0,mxt=0;
struct node{
	int t,v; //t过期时间,v利润 
	friend bool operator<(node n1,node n2){//友元函数
		return n1.v<n2.v;
	} 
}a[10010];
bool cmp(node n1,node n2){
	return n1.t>n2.t; //时间大的排前面 
}
priority_queue<node> q; //在优先队列q中默认按照利润从大到小排序 
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].v>>a[i].t;
		mxt=max(mxt,a[i].t); //取最晚的过期时间为mxt 
	} 
	sort(a+1,a+n+1,cmp); //按时间从后往前排序 
	for(int i=mxt,k=1;i>=1;i--){ //从最后一天开始尝试卖东西,从后往前 
		while(a[k].t==i){ //第i天过期的全部入队 
			q.push(a[k]);
			k++;
		}
		//第i天可以卖一件商品 
		if(q.size()){ //队列非空 
			ans+=q.top().v;
			q.pop(); 
		}
	} 
	cout<<ans;
	return 0;
}
/*	Problem: 商店
	Language: C++	Result: 正确 	Time: 2026-10-06 14:40:19
	User: admin  	Problem: 3935	contest_id: 0*/
#include<iostream>
#include<algorithm> 
using namespace std;
int n,ans=0;
struct node{
	int l,r;
}a[100010]; 
bool cmp(node n1,node n2){//按照左端点从小到大排序,如果左端点相同右端点按照从大到小排序
	if(n1.l==n2.l) return n1.r>n2.r;
	return n1.l<n2.l;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		int x,y; cin>>x>>y;
		a[i].l=x-y; //计算区间左右端点 
		a[i].r=x+y;
	}
	sort(a+1,a+n+1,cmp);
	int mx=0; //mx表示右端点的前缀最大值
	for(int i=1;i<=n;i++){//从前往后遍历,如果当前山的右端点大于前面所有山的右端点,则答案+1 
		if(a[i].r>mx){
			ans++;
			mx=a[i].r; //右端点的前缀最大值
		}
	} 
	cout<<ans;
	return 0;
}
/*
1 计算每个区间的左右端点 [x-y,x+y]
2 按照左端点从小到大排序,如果左端点相同右端点按照从大到小排序
3 从前往后遍历,如果当前山的右端点大于前面所有山的右端点,则答案+1 
*/

/*	Problem: 山峰数量
	Language: C++	Result: 正确 	Time: 2026-10-06 11:50:39
	User: admin  	Problem: 2545	contest_id: 0*/
#include<iostream>
using namespace std;
int n,m,a[210],b[210],ans=0,v[210];
//v[i]表示草地编号i的种草类型 
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++) cin>>a[i]>>b[i];
	
	for(int i=1;i<=n;i++){ //从草地1到草地n尝试种草 
		for(int k=1;k<=4;k++){ //尝试1~4号草 
			int flag=0; //假设位置i可以种草编号为k
			//矛盾:小羊喜欢的另外一块草地已经被种了编号k 
			for(int j=1;j<=m;j++){ //枚举小羊 
				if(i==b[j]&&v[a[j]]==k || i==a[j]&&v[b[j]]==k){
					flag=1; //确定是矛盾的
					break; 
				} 
			} 
			if(!flag){ //不矛盾 
				v[i]=k; //确定草地i种草编号为k 
				cout<<k;
				break; 
			}
		} 
	}
	return 0;
}

/*	Problem: 种草
	Language: C++	Result: 正确 	Time: 2026-10-06 11:25:35
	User: admin  	Problem: 2535	contest_id: 0*/
#include<iostream>
using namespace std;
long long T,n,a[500010],ans=0;
int main(){
	cin>>T;
	while(T--){
		cin>>n;
		ans=1e18;//小西吃到的总和初始值 
		for(int i=1;i<=n;i++){
			cin>>a[i];
			a[i]+=a[i-1]; //前缀和 
		}
		//阿木吃掉n/2-1,那么小西吃掉中间的n/2+1
		for(int i=1;i+n/2<=n;i++){ //枚举小西吃蛋糕的左端点 
			int j=i+n/2; //小西吃蛋糕的右端点
			ans=min(ans,a[j]-a[i-1]); //取区间和[i,j]的最小值 
		} 
		cout<<ans<<" "<<a[n]-ans<<endl; 
	}
	return 0;
}
/*	Problem: 分割蛋糕
	Language: C++	Result: 正确 	Time: 2026-10-06 11:02:02
	User: admin  	Problem: 4243	contest_id: 0*/
#include<iostream>
using namespace std;
int n,a[10010],b[10010],ans[10010],sum=0,v[100010];
//v[i]表示位置i原始值是相等的 
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++){
		cin>>b[i];
		if(a[i]==b[i]) sum++,v[i]=1;//统计原始相等位置的数量,并进行标记 
	}
	for(int k=1;k<=n;k++){ //枚举区间的中心位置 
		int i=k,cnt=0; //cnt相对变化值
		for(int j=i;i>=1&&j<=n;i--,j++){//枚举区间长度为奇数,且中心为k的所有区间[i,j] 
			if(a[j]!=b[i]&&v[i]) cnt--;
			else if(a[j]==b[i]&&!v[i]) cnt++;
			
			if(a[i]!=b[j]&&v[j]) cnt--;
			else if(a[i]==b[j]&&!v[j]) cnt++;
			
			ans[sum+cnt]++;  //当前区间[i,j]对答案的影响 
		} 
		i=k,cnt=0; //cnt相对变化值
		for(int j=i+1;i>=1&&j<=n;i--,j++){ //枚举区间长度为偶数,且中心为k和k+1的所有区间[i,j]  
			if(a[j]!=b[i]&&v[i]) cnt--;
			else if(a[j]==b[i]&&!v[i]) cnt++;
			
			if(a[i]!=b[j]&&v[j]) cnt--;
			else if(a[i]==b[j]&&!v[j]) cnt++;
			
			ans[sum+cnt]++;  //当前区间[i,j]对答案的影响 
		} 
	} 
	
	for(int i=0;i<=n;i++) cout<<ans[i]<<endl; 
	return 0;
}
/*	Problem: 牛的检查
	Language: C++	Result: 正确 	Time: 2026-10-06 10:11:33
	User: admin  	Problem: 4473	contest_id: 0*/
#include<iostream>
#include<algorithm>
using namespace std;
int n,t,a[100010],b[100010],ans=0,ta,tb;
int main(){
	cin>>n>>t;
	for(int i=1;i<=n;i++) cin>>a[i],a[i]+=a[i-1];
	for(int i=1;i<=n;i++) cin>>b[i],b[i]+=b[i-1];
	
	for(int i=0;i<=n;i++){ //枚举a选择前i个关卡 
		if(a[i]>t) break;
		int x=t-a[i]; //可以用与b选择关卡的时间
		int j=upper_bound(b+1,b+n+1,x)-b-1; //二分找到最后一个<=x的位置:>x的第一个位置-1 
		ans=max(ans,i+j); 
	}
	cout<<ans;
	return 0;
}
/*	Problem: 闯关游戏
	Language: C++	Result: 正确 	Time: 2026-10-05 17:06:22
	User: admin  	Problem: 2007	contest_id: 0*/
#include<iostream>
using namespace std;
int n,a[100010],b[100010],v[100010],ans=0;
//v[i]表示数字i已经被移动过,可以直接过掉 
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int j=1;j<=n;j++) cin>>b[j];
	for(int i=1,j=1;i<=n&&j<=n;){
		while(v[a[i]]) i++; //数字a[i]已经在前面比较时,处理了
		 
		if(a[i]!=b[j]){ //b[j]这个数字需要从a数组的后面某个位置拿过来 
			v[b[j]]=1; //表示数字b[j]已经被处理过了 
			ans++; //操作次数+1
			j++; 
		}else{
			v[b[j]]=1; //表示数字b[j]已经被处理过了 
			i++,j++;
		}
	} 
	cout<<ans;
	return 0;
}
/*	Problem: 拍照顺序
	Language: C++	Result: 正确 	Time: 2026-10-05 16:15:34
	User: admin  	Problem: 2523	contest_id: 0*/
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
long long n,q,ans=0;
string s;
vector<long long> v[300]; //v[i]用于保存字符i的所有下标位置 
int main(){
    cin>>n>>q>>s;
    for(int i=0;i<s.size();i++) v[s[i]].push_back(i+1); //存储字符s[i]的位置i 
    while(q--){ //q次询问
        int l,r; scanf("%d %d",&l,&r); 
        ans=-1; //答案初始值为-1,表示不存在这样的三角形 
        for(int c1='a';c1<='z';c1++){ //枚举abb中的第一个字符 
            int i=lower_bound(v[c1].begin(),v[c1].end(),l)-v[c1].begin(); //区间[l,r]中第一个字符c1的位置
            if(i>=v[c1].size()) continue; //c1在区间[l,r]中无法构成有效的abb三角形
            for(int c3='a';c3<='z';c3++){ //枚举abb中的第三个字符 
                if(c3==c1 || v[c3].size()<2) continue; //无法构成有效的abb三角形 
                int k=upper_bound(v[c3].begin(),v[c3].end(),r)-v[c3].begin()-1; 
                if(k<=0 || v[c3][k-1]<=v[c1][i]) continue; //无法构成有效的abb三角形
                int j=upper_bound(v[c3].begin(),v[c3].end(),(v[c3][k]+v[c1][i])/2)-v[c3].begin();  
                if(j<k&&j>=0&&v[c1][i]<v[c3][j]) ans=max(ans,(v[c3][k]-v[c3][j])*(v[c3][j]-v[c1][i]));
                j--;
                if(j<k&&j>=0&&v[c1][i]<v[c3][j]) ans=max(ans,(v[c3][k]-v[c3][j])*(v[c3][j]-v[c1][i]));
            }
        } 
        printf("%lld\n",ans);
    } 
    return 0;
}
/*	Problem: 三元组
	Language: C++	Result: 正确 	Time: 2026-10-05 15:40:39
	User: admin  	Problem: 4479	contest_id: 0*/
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
long long n,q,ans=0;
string s;
vector<long long> v[300]; //v[i]用于保存字符i的所有下标位置 
int main(){
	cin>>n>>q>>s;
	for(int i=0;i<s.size();i++) v[s[i]].push_back(i); //存储字符s[i]的位置i 
	while(q--){ //q次询问
		int l,r; scanf("%d %d",&l,&r); 
		l--;r--; //字符下标从0开始 
		ans=-1; //答案初始值为-1,表示不存在这样的三角形 
		for(int c1='a';c1<='z';c1++){ //枚举abb中的第一个字符 
			int i=lower_bound(v[c1].begin(),v[c1].end(),l)-v[c1].begin(); //区间[l,r]中第一个字符c1的位置
			if(i>=v[c1].size()) continue; //c1在区间[l,r]中无法构成有效的abb三角形
			for(int c3='a';c3<='z';c3++){ //枚举abb中的第三个字符 
				if(c3==c1 || v[c3].size()<2) continue; //无法构成有效的abb三角形 
				int k=upper_bound(v[c3].begin(),v[c3].end(),r)-v[c3].begin()-1; 
				if(k<=0 || v[c3][k-1]<=v[c1][i]) continue; //无法构成有效的abb三角形
				int j=upper_bound(v[c3].begin(),v[c3].end(),(v[c3][k]+v[c1][i])/2)-v[c3].begin();  
				if(j<k) ans=max(ans,(v[c3][k]-v[c3][j])*(v[c3][j]-v[c1][i]));
				j--;
				if(j>=0&&v[c1][i]<v[c3][j]) ans=max(ans,(v[c3][k]-v[c3][j])*(v[c3][j]-v[c1][i]));
			}
		} 
		printf("%lld\n",ans);
	} 
	return 0;
}

/*	Problem: 三元组
	Language: C++	Result: 正确 	Time: 2026-10-05 15:28:57
	User: admin  	Problem: 4479	contest_id: 0*/
#include<iostream>
using namespace std;
long long n,m,ans=0,f[1000010],s[1000010],mn=1e9,mx=0;
bool check(int x){//判断是否可以找到至少一个连续区间的最大辣度是x,且风味和>=m 
	long long sum=0; //风味和初始为0
	for(int i=1;i<=n;i++){
		if(s[i]>x) sum=0; //区间断了,重新开始
		else sum+=f[i]; //区间连续 
		
		if(sum>=m) return true; //找了一个满足条件的区间,结束了 
	} 
	return false; //循环结束,都没有找到这样的区间 
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>f[i]>>s[i];
		mn=min(mn,s[i]);
		mx=max(mx,s[i]);
	}
	int l=mn,r=mx;
	while(l<=r){
		int mid=(l+r)/2;
		if(check(mid)) ans=mid,r=mid-1; //答案有可能更小
		else l=mid+1; //答案只可能更大 
	}
	cout<<ans; 
	return 0;
}
/*
1 辣度最小值满足单调性,所以可以二分
2 当辣度最大值为mid时,只需要从前往后找到一个连续区间的风味和>=m,且辣度最大值不超过mid即可 
*/

/*	Problem: 辣度
	Language: C++	Result: 正确 	Time: 2026-10-05 14:30:40
	User: admin  	Problem: 4800	contest_id: 0*/
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,c,a[100010],ans=0;
bool check(int x){ //检查最长等待时间x是否可以拉走所有的牛 
	int cnt=1,s=1; //第1头牛肯定需要第1辆车,s表示当前这辆车等待最长的牛的编号
	for(int i=1;i<=n;i++){ //遍历每一头牛的到机场时间 
		if(a[i]-a[s]>x || i-s+1>c){ //第s头牛等待时间不能超过x,且s~i这个区间的牛数不能超过容量c 
			cnt++; //新开一趟车
			s=i; //这头牛成了新车的等待时间最长的牛 
		} 
	} 
	return cnt<=m; //m辆车够则返回true 
}
int main(){
	cin>>n>>m>>c;
	for(int i=1;i<=n;i++) cin>>a[i];
	sort(a+1,a+n+1);
	int l=0,r=a[n]-a[1]; //答案所在的区间是l-r 
	while(l<=r){
		int mid=(l+r)/2; //检查最长等待时间mid是否可行
		if(check(mid)) ans=mid,r=mid-1; //等待时间有可能更短 
		else l=mid+1; //等待时间只可能更长 
	} 
	cout<<ans; 
	return 0;
}

/*	Problem: 牛吃草大会
	Language: C++	Result: 正确 	Time: 2026-10-05 11:54:29
	User: admin  	Problem: 2540	contest_id: 0*/
#include<iostream>
#include<algorithm>
using namespace std;
long long n,k,L,a[100010],ans=0;
bool cmp(long long x,long long y){
	return x>y;
}
bool check(int x){ //检查指数x是否可行 
	long long s=0; //统计作弊的引用总次数 
	for(int i=1;i<=x;i++){ //达到x篇就够了 
		if(a[i]<x){
			if(x-a[i]>k) return false; 
			s+=x-a[i]; 
		} 
		if(s>k*L) return false;
	} 
	return true; //已经有x篇的引用次数达到x以上 
}
int main(){
	cin>>n>>k>>L;
	for(int i=1;i<=n;i++) cin>>a[i];
	sort(a+1,a+n+1,cmp); //引用次数从大到小排序
	int l=0,r=n;
	while(l<=r){
		int mid=(l+r)/2;
		if(check(mid)) ans=mid,l=mid+1;
		else r=mid-1;
	} 
	cout<<ans;
	return 0;
}
/*	Problem: 最大 h 指数
	Language: C++	Result: 正确 	Time: 2026-10-05 10:51:16
	User: admin  	Problem: 2572	contest_id: 0*/
#include<iostream>
#include<algorithm> 
using namespace std;
int n,c,a[100010],ans=0;
bool check(int x){ //检查两头牛之间的最小距离是x,是否可行 
	int s=a[1],cnt=1; //s表示已经安排宿舍的最后一头牛的位置,cnt表示安排了宿舍的牛数
	for(int i=2;i<=n;i++){
		if(a[i]-s>=x){
			cnt++; //又有一头牛有了宿舍
			s=a[i];  //s表示已经安排宿舍的最后一头牛的位置
			if(cnt>=c) return true; 
		}
	} 
	
	return false; //所有牛栏安排完毕,但是不够c头牛分配 
}
int main(){
	cin>>n>>c;
	for(int i=1;i<=n;i++) cin>>a[i];
	sort(a+1,a+n+1); //找牛栏位置从小到大排序
	int l=0,r=a[n]-a[1];
	while(l<=r){
		int mid=(l+r)/2;
		if(check(mid)) ans=mid,l=mid+1; //答案有可能更大
		else r=mid-1; 
	} 
	cout<<ans;
	return 0;
}
/*	Problem: 愤怒的牛
	Language: C++	Result: 正确 	Time: 2026-10-05 10:06:18
	User: admin  	Problem: 2117	contest_id: 0*/
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,ans=0;
struct node{
	int p,a; //p单价,a数量 
}a[100010];
bool cmp(node n1,node n2){
	return n1.p<n2.p;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++) cin>>a[i].p>>a[i].a;
	sort(a+1,a+m+1,cmp);
	for(int i=1;i<=m;i++){
		if(n>=a[i].a){
			n-=a[i].a;
			ans+=a[i].a*a[i].p; //把这个农户的全买 
		}else{
			ans+=n*a[i].p; //剩余的n全部在这个农户这里买完
			n=0;
			break; 
		} 
	} 
	cout<<ans;
	return 0;
}

/*	Problem: 混合牛奶 
	Language: C++	Result: 正确 	Time: 2026-10-05 09:48:39
	User: admin  	Problem: 1570	contest_id: 0*/
#include <iostream>
#include <algorithm>
using namespace std;
int n, m, ans;
struct node{//存奶农结构体
    int p, a;
}a[100010];
int cmp(node a,node b){ //重载排序
    return a.p<b.p;  //价格低的排前面 
}
int main(){
    cin >> n >> m;
    for(int i = 1; i <= m;i++) cin >> a[i].p >> a[i].a;
    sort(a+1,a+1+m,cmp);
    for (int i = 1; i <= m;i++){ //贪心
        if(n>=a[i].a){    //当前的钱够买所有的奶
            n-=a[i].a;
            ans+=a[i].a*a[i].p;  //全买掉
        }else{//不够买所有的奶
            ans+=n*a[i].p; //能买多少买多少并结束
            n=0;
            break;
        }
    }
    cout << ans;
    return 0;
}
/*	Problem: 混合牛奶 
	Language: C++	Result: 正确 	Time: 2026-09-24 16:44:45
	User: admin  	Problem: 1570	contest_id: 0*/
#include<iostream>
#include<algorithm>
using namespace std;
int n,c,a[100010],ans=0;
bool check(int x){ //检查最小x的距离,是否可以住下c头牛 
    int s=a[1],cnt=1; //cnt表示可以住下的牛的数量 
    for(int i=2;i<=n;i++) {
        if(a[i]-s>=x){//距离达到x 
            cnt++;//又有一头牛可以住下来 
            s=a[i];//更新最后一头牛的位置 
            if(cnt>=c) return true; //已经够住下c头牛 
        }
    }
    return false;//住不下 
}
int main() {
    scanf("%d%d",&n,&c);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    int l=0,r=a[n]-a[1];
    while(l<=r) {
        int mid=(l+r)/2;
        if(check(mid)) ans=mid,l=mid+1;//答案有可能更大 
        else r=mid-1;//答案只可能更小 
    }
    printf("%d",ans);
    return 0;
}
/*	Problem: 愤怒的牛
	Language: C++	Result: 正确 	Time: 2026-09-24 16:09:21
	User: admin  	Problem: 2117	contest_id: 0*/
#include<iostream>
using namespace std;
typedef long long ll;
long long n,ans=0,a[15005],b[15005],sum,c[15005],p[15005];
//ans表示初始相等位置的数量,p[i]=1表示位置i的ai和bi相同 
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];//输入A数组
	for(int j=1;j<=n;j++){
		cin>>b[j]; //输入b数组
		if(a[j]==b[j]) ans++,p[j]=1;//预处理ans,打位置标记(后面会用到)
	}
	for(int k=1;k<=n;k++){ //以k为中心枚举
		int i=k;           //用i记作k,因为k不能改动
		int sum=0;         //记录相较于原来答案的变化
		for(int j=i;i>0&&j<=n;j++,i--){//区间内,数的个数为奇数
			if(a[j]!=b[i]&&p[i]) sum--;//如果下标为i,j的两个数字调换后不一样且 调换前一样(P数组判断)会比原先少一个
			else if(a[j]==b[i]&&!p[i]) sum++;//如果下标为i,j的两个数字调换后一样且 调换前不一样(P数组判断)会比原先多一个
			if(a[i]!=b[j]&&p[j]) sum--;
			else if(a[i]==b[j]&&!p[j]) sum++;//反之同理
			c[ans+sum]++;    //得到的答案数++
		}
		sum=0;//i和sum都变了,所以要重新赋初值
		i=k;
		for(int j=i+1;i>0&&j<=n;j++,i--){//区间内,数的个数为偶数,for循环里面相同
			if(a[j]!=b[i]&&p[i]) sum--;
			else if(a[j]==b[i]&&!p[i]) sum++;
			if(a[i]!=b[j]&&p[j]) sum--;
			else if(a[i]==b[j]&&!p[j]) sum++;
			c[ans+sum]++;               //原始加上变化的,得到的答案++
		}
	}
	for(int i=0;i<=n;i++)cout<<c[i]<<endl;//从小到大输出答案
	return 0;
}
/*	Problem: 牛的检查
	Language: C++	Result: 正确 	Time: 2026-09-21 15:00:19
	User: admin  	Problem: 4473	contest_id: 0*/
#include<iostream>
using namespace std;
typedef long long ll;
ll t,n,a[500005],ans;
int main() {
	cin>>t;
    while(t--){
        cin>>n; 
		ans=1e18;  //初始化位极大值 
        for(int i=1;i<=n;++i){
        	cin>>a[i];
			a[i]+=a[i-1]; //前缀和 
		}
        int ln=n/2;
        for(int i=1;i+n/2<=n;++i) //合并区间是i~i+n/2
            ans=min(ans,a[i+n/2]-a[i-1]);
        cout<<ans<<" "<<a[n]-ans<<endl;
    }
    return 0;
}
/*	Problem: 分割蛋糕
	Language: C++	Result: 正确 	Time: 2026-09-21 08:39:57
	User: admin  	Problem: 4243	contest_id: 0*/
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
long long n,q,ans;
string s;
vector<long long> v[300];//c[i]存储所有字符i的所有下标位置 
int main(){
    cin>>n>>q>>s;
    for(int i=0;i<n;i++) v[s[i]].push_back(i); //存储每个s[i]的下标位置 
    while(q--){
        int l,r;  scanf("%d %d",&l,&r); //查询区间 
        l--;r--; ans=-1;
        for(int c1='a';c1<='z';c1++){     //枚举ABB中的第一个字符A 
            int i=lower_bound(v[c1].begin(),v[c1].end(),l)-v[c1].begin();
            if(i>=v[c1].size() || i>=r-1) continue;     //不在区间范围内 
            for(int c3='a';c3<='z';c3++){//枚举ABB中的第三个字符B 
                if(c3==c1 || v[c3].size()<2) continue;   //c3==c1 或 c3不够2个 
                int k=upper_bound(v[c3].begin(),v[c3].end(),r)-v[c3].begin()-1;
                if(k<=0 || v[c3][k-1]<=v[c1][i]) continue;  //不能构成ABB 
                //第一个 >v[c3][k]+v[c1][i])/2 的位置,即ABB中的第二个字符B的最佳位置 
                int j=upper_bound(v[c3].begin(),v[c3].end(),(v[c3][k]+v[c1][i])/2)-v[c3].begin();
                if(j<k) ans=max(ans,(v[c3][k]-v[c3][j])*(v[c3][j]-v[c1][i]));
                j--;//第一个 ≤v[c3][k]+v[c1][i])/2 的位置,也有可能是ABB中的第二个字符B的最佳位置 
                if(j>=0&&v[c1][i]<v[c3][j]) ans=max(ans,(v[c3][k]-v[c3][j])*(v[c3][j]-v[c1][i]));
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}
/*	Problem: 三元组
	Language: C++	Result: 正确 	Time: 2026-09-20 19:00:48
	User: admin  	Problem: 4479	contest_id: 0*/
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
long long n,q,ans;
string s;
vector<long long> v[300];//c[i]存储所有字符i的所有下标位置 
int main(){
    cin>>n>>q>>s;
    for(int i=0;i<n;i++) v[s[i]].push_back(i); //存储每个s[i]的下标位置 
    while(q--){
        int l,r;  cin>>l>>r; //查询区间 
        l--;r--; ans=-1;
        for(int c1='a';c1<='z';c1++){     //枚举ABB中的第一个字符A 
            int i=lower_bound(v[c1].begin(),v[c1].end(),l)-v[c1].begin();
            if(i>=v[c1].size() || i>=r-1) continue;     //不在区间范围内 
            for(int c3='a';c3<='z';c3++){//枚举ABB中的第三个字符B 
                if(c3==c1 || v[c3].size()<2) continue;   //c3==c1 或 c3不够2个 
                int k=upper_bound(v[c3].begin(),v[c3].end(),r)-v[c3].begin()-1;
                if(k<=0 || v[c3][k-1]<=v[c1][i]) continue;  //不能构成ABB 
                //第一个 >v[c3][k]+v[c1][i])/2 的位置,即ABB中的第二个字符B的最佳位置 
                int j=upper_bound(v[c3].begin(),v[c3].end(),(v[c3][k]+v[c1][i])/2)-v[c3].begin();
                if(j<k) ans=max(ans,(v[c3][k]-v[c3][j])*(v[c3][j]-v[c1][i]));
                j--;//第一个 ≤v[c3][k]+v[c1][i])/2 的位置,也有可能是ABB中的第二个字符B的最佳位置 
                if(j>=0&&v[c1][i]<v[c3][j]) ans=max(ans,(v[c3][k]-v[c3][j])*(v[c3][j]-v[c1][i]));
            }
        }
        cout<<ans<<'\n';
    }
    return 0;
}
/*	Problem: 三元组
	Language: C++	Result: 正确 	Time: 2026-09-20 18:58:43
	User: admin  	Problem: 4479	contest_id: 0*/
#include<iostream> //递推方法2:从下往上推 
using namespace std;//f[i][j]表示从最后一行走到a[i][j]的最大值 
int n,a[1010][1010],f[1010][1010],ans=0;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=i;j++) cin>>a[i][j];
	
	for(int j=1;j<=n;j++) f[n][j]=a[n][j]; //初始值 
	
	for(int i=n-1;i>=1;i--){ //从下往上推 
		for(int j=1;j<=i;j++){ 
			f[i][j]=max(f[i+1][j],f[i+1][j+1])+a[i][j]; //递推关系 
		} 
	} 
	cout<<f[1][1]; //答案:从最后一行走到a[1][1]的最大值 
	return 0;
}
/*	Problem: 数字三角形
	Language: C++	Result: 正确 	Time: 2026-09-19 15:56:54
	User: admin  	Problem: 1302	contest_id: 0*/
#include<iostream> //递推方法1:从上往下推 
using namespace std;//f[i][j]表示从a[1][1]走到a[i][j]的最大和
int n,a[1010][1010],f[1010][1010],ans=0;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=i;j++) cin>>a[i][j];
	
	f[1][1]=a[1][1]; //初始值
	for(int i=2;i<=n;i++){
		for(int j=1;j<=i;j++){
			f[i][j]=max(f[i-1][j],f[i-1][j-1])+a[i][j];//递推 
		}
	} 
	
	for(int j=1;j<=n;j++) ans=max(ans,f[n][j]); //答案在f[n] 
	cout<<ans;
	return 0;
}
/*	Problem: 数字三角形
	Language: C++	Result: 正确 	Time: 2026-09-19 15:48:28
	User: admin  	Problem: 1302	contest_id: 0*/
#include<iostream>
using namespace std;
int n,a[100100],ans=0,mx;//mx表示前缀最大值 
int main(){
	cin>>n>>a[1];
	ans+=a[1]; //第1项的最大值就是a[1] 
	mx=a[1];   //第1项的最大值就是a[1] 
	for(int i=2;i<=n;i++){
		a[i]=(379*a[i-1]+131)%997; //递推:计算数列 
		mx=max(mx,a[i]); //计算前缀最大值
		ans+=mx; 
	}
	cout<<ans;
	return 0;
}
/*	Problem: 前缀最大值
	Language: C++	Result: 正确 	Time: 2026-09-19 15:18:04
	User: admin  	Problem: 2687	contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0,a[100010];
int main(){
	a[1]=2; //1刀切成2份 
	cin>>n;
	for(int i=2;i<=n;i++){
		a[i]=a[i-1]+i;  //递推关系式:从已知推未知 
	}
	cout<<a[n]; 
	return 0;
}
/*	Problem: 切蛋糕
	Language: C++	Result: 正确 	Time: 2026-09-19 15:12:48
	User: admin  	Problem: 1977	contest_id: 0*/
#include<iostream>
using namespace std;
int r,c,k,ans=0;
char a[110][110]; 
bool f(int x,int y){//从坐标x,y往右,正好是连续的k个.
	for(int j=y;j<=y+k-1;j++){ //往右边遍历k个位置 
		if(a[x][j]!='.') return false; 
	} 
	return true;
}
bool g(int x,int y){//从坐标x,y往下,正好是连续的k个.
	for(int i=x;i<=x+k-1;i++){ //往下边遍历k个位置 
		if(a[i][y]!='.') return false;
	} 
	return true;
}
int main(){
	cin>>r>>c>>k;
	for(int i=1;i<=r;i++){
		for(int j=1;j<=c;j++){
			cin>>a[i][j]; //输入地图 
		}
	}
	
	for(int i=1;i<=r;i++){
		for(int j=1;j<=c;j++){ //枚举队伍的起点a[i][j] 
			if(a[i][j]=='.'){ //a[i][j]必须是空地,才能作为起点 
				if(f(i,j)) ans++; //往右数,正好是连续的k个.
				if(g(i,j)) ans++; //往下数,正好是续的k个. 
			} 
		}
	}
	if(k>1) cout<<ans; 
	else cout<<ans/2;  //k==1特殊情况,不存在往右边和往下面两种情况 
	return 0;
}

/*	Problem: 舞台列队
	Language: C++	Result: 正确 	Time: 2026-09-19 14:48:50
	User: admin  	Problem: 2345	contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0,a[300][300];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		int x,y;
		cin>>x>>y;
		a[x+110][y+110]=1; //数组下标计数,坐标有负数则统一偏移100 
	} 
	for(int i=0;i<=220;i++){
		for(int j=0;j<=220;j++){ //枚举a[i][j]作为左上角的坐标点 
			if(a[i][j]){ //左上角a[i][j]有标记 
				for(int k=i+1;k<=220;k++){ //枚举左下角的点 
					if(a[k][j]){ //左下角a[k][j]有标记 
						for(int g=j+1;g<=220;g++){ //枚举右边的那条边 
							if(a[i][g] && a[k][g]){ //右上角和右下角有标记 
								ans++; 
								//cout<<i<<' '<<j<<';'<<k<<' '<<g<<endl; 
							} 
						} 
					}
				} 
			} 
		}
	} 
	cout<<ans; 
	return 0;
}
/*	Problem: 统计数量
	Language: C++	Result: 正确 	Time: 2026-09-19 14:26:39
	User: admin  	Problem: 2422	contest_id: 0*/
#include<iostream>
#include<cstring>
using namespace std;
char a[1010]; 
int main(){
	cin>>a;
	int len=strlen(a); //计算出字符串a的实际长度 
	for(int i=len-2;i>=0;i--){ //#不需要输出 
		cout<<a[i];
	} 
	return 0;
}
/*	Problem: 字符串倒序输出
	Language: C++	Result: 正确 	Time: 2026-09-19 11:18:43
	User: admin  	Problem: 1130	contest_id: 0*/
#include<iostream>
using namespace std;
char c1[1010]="Hello Hi"; //默认:数据的下标是从0开始的 
char c2[1010]="Nice to Meet You";
int main(){
	cout<<c1<<endl<<c2<<endl;
	cout<<c1[1]<<c1[3]<<c1[5]<<c1[7]<<endl;
	cout<<c2[0]<<c2[2]<<c2[4]<<c2[6]<<c2[8]<<endl;
	return 0;
} 
/*	Problem: 字符数组的定义赋值与输出
	Language: C++	Result: 正确 	Time: 2026-09-19 11:00:45
	User: admin  	Problem: 1127	contest_id: 0*/
#include<iostream>
#include<cmath> 
using namespace std;
bool check(int x){ //函数功能:判断x是完全数 
	int cnt=1; //1肯定是x的因子
	for(int i=2;i<=sqrt(x);i++){ //所有小于x的因子全部累加起来 
		if(x%i==0){
			cnt+=i; //x的因子累加
			cnt+=x/i; //因子是成对的 
			
			if(i*i==x) cnt-=i; //x正好是完全平方数,那么就多加了一个i 
		} 
	}
	
	
	return cnt==x;  //除x之外的因子之和 正好等于 x,则x是完全数 
}
int n;
int main(){
	cin>>n;
	for(int i=2;i<=n;i++){//枚举2~n之间的每个数字 
		if(check(i)){ //判断i是完全数 
			cout<<i<<" "; 
		} 
	} 
	return 0;
}
/*	Problem: 完全数
	Language: C++	Result: 正确 	Time: 2026-09-19 10:35:18
	User: admin  	Problem: 1164	contest_id: 0*/
#include<iostream>
#include<cmath> 
using namespace std;
int a,b;
bool prime(int x){ //功能:判断x是否是质数 
	for(int i=2;i<=sqrt(x);i++){ //i*i<=x 等价于  i<=sqrt(x)
		if(x%i==0){ //找到了一个因子(不是1,也不是自身) 
			return false; 
		}
	} 
	return true;
}
int main(){
	cin>>a>>b;
	for(int i=a;i<=b;i++){ //计算a~b之间,每一个数字i的最大质因子 
		for(int j=i;;j--){//计算i的最大质因子:从大到小枚举i的因子  
			if(i%j==0&&prime(j)){//j是i的因子,且j是质数,那么j就是i的最大质因子 
				cout<<j;
				if(i<b) cout<<',';  //只有最后一个数字b后面没有逗号 
				break; //break只能跳出当前层循环 
			} 
		} 
	}
	return 0;
}
/*	Problem: 最大质因子(2)
	Language: C++	Result: 正确 	Time: 2026-09-19 10:18:56
	User: admin  	Problem: 1680	contest_id: 0*/
#include<iostream>
#include<cmath> 
using namespace std;
int n,ans=0;
bool prime(int x){ //功能:判断x是否是质数 
	for(int i=2;i<=sqrt(x);i++){ //i*i<=x 等价于  i<=sqrt(x)
		if(x%i==0){ //找到了一个因子(不是1,也不是自身) 
			return false; 
		}
	} 
	return true;
}
int main(){
	cin>>n;
	for(int i=2;i<=n/2;i++){ //枚举较小的那个加数 i 
		int j=n-i; //计算出较大的另一个加数 j
		if(prime(i)&&prime(j)){ //i和j都是质数 
			ans=max(ans,i*j); //取乘积的最大值 
		}
	}
	cout<<ans; 
	return 0;
}
/*	Problem: 质数的和与积
	Language: C++	Result: 正确 	Time: 2026-09-19 10:07:35
	User: admin  	Problem: 1677	contest_id: 0*/
#include<iostream>
#include<cmath> 
using namespace std;
int n,ans=0;
bool prime(int x){ //功能:判断x是否是质数 
	for(int i=2;i<=sqrt(x);i++){ //i*i<=x 等价于  i<=sqrt(x)
		if(x%i==0){ //找到了一个因子(不是1,也不是自身) 
			return false; 
		}
	} 
	return true;
}
int main(){
	cin>>n;
	for(int i=n;;i--){ //从大到小 枚举n的因子
		if(n%i==0&&prime(i)){ //i是n的因子,且i是质数,那么i就是n的最大质因子 
			cout<<i;
			break;
		} 
	} 
	return 0;
}
/*	Problem: 最大质因子
	Language: C++	Result: 正确 	Time: 2026-09-19 09:56:02
	User: admin  	Problem: 2298	contest_id: 0*/
#include<iostream>
#include<cmath> 
using namespace std;
int n,ans=0;
bool prime(int x){ //功能:判断x是否是质数 
	for(int i=2;i<=sqrt(x);i++){ //i*i<=x 等价于  i<=sqrt(x)
		if(x%i==0){ //找到了一个因子(不是1,也不是自身) 
			return false; 
		}
	} 
	return true;
}
int main(){
	cin>>n;
	for(int i=n;;i--){
		if(prime(i)){ //判断i是质数 
			cout<<i;
			return 0; 
		}
	} 
	return 0;
}
/*	Problem: 比n小的最大质数
	Language: C++	Result: 正确 	Time: 2026-09-19 09:45:34
	User: admin  	Problem: 1153	contest_id: 0*/
#include<iostream>
using namespace std;
long long n,ans=0; //注意题目的数据范围 
int main(){
	cin>>n;
	while(n>0){
		int g=n%10; //把n的个位拆出来
		ans+=g*g*g; //连乘3次并累加起来
		n/=10;      //抹掉n的个位
	} 
	cout<<ans;
	return 0;
}
/*
重复做什么?
1、把n的个位拆出来,然后连乘3次并累加起来。
2、抹掉n的个位。 
*/

/*	Problem: 水仙花指数
	Language: C++	Result: 正确 	Time: 2026-09-18 19:48:43
	User: admin  	Problem: 1174	contest_id: 0*/
#include<iostream>
using namespace std;
int m,n,ans=0;
int main(){
	cin>>m>>n;
	for(int i=1;i<=n;i++){ //重复n次 
		int x;
		cin>>x; //第i个人来了,告诉你取药的数量是x
		if(m>=x){  //够:给他,更新剩余数量
			m-=x;
		}else{     //不够:不给他,记录拿不到药品的人数 
			ans++; //计数 
		}
	}
	cout<<ans; 
	return 0;
}
/*
重复动作:判断药品剩余的数量是否满足当前这个人的需求
  够:给他,更新剩余数量
  不够:不给他,记录拿不到药品的人数 
*/

/*	Problem: 药房管理
	Language: C++	Result: 正确 	Time: 2026-09-18 19:23:04
	User: admin  	Problem: 1626	contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0;
int main(){
	cin>>n;
	if(n<0){ //如果n是负数 
		cout<<"-";
		n=-n;   //负负得正 
	}
	//1 取出n的个位,将个位拼接到新数字的最后面
	//2 抹掉n的个位
	//如果n>0,继续第1步-第2步
	while(n>0){
		ans=ans*10+n%10; //ans代表新数字,ans扩大10倍+n的个位
		n/=10; 
	} 
	cout<<ans;
	return 0;
}
/*	Problem: 数字反转.
	Language: C++	Result: 正确 	Time: 2026-09-18 19:01:17
	User: admin  	Problem: 1475	contest_id: 0*/
#include<iostream>
using namespace std;
string s1,s2;
int main(){
	cin>>s1>>s2;
	int p1=s1.find(s2); //查找函数 
	int p2=s2.find(s1);
	if(p1!=-1){//找不到,则查找结果是-1 
		cout<<s2<<" is substring of "<<s1;
	}else if(p2!=-1){
		cout<<s1<<" is substring of "<<s2;
	}else{
		cout<<"No substring";
	}
	return 0;
}
/*	Problem: 验证子串
	Language: C++	Result: 正确 	Time: 2026-09-18 15:24:55
	User: admin  	Problem: 1660	contest_id: 0*/
#include<iostream>
using namespace std;
string s;
char c;
int main(){
	cin>>s>>c;
	while(s.find(c)!=-1){
		int p=s.find(c); //找到字符c的位置
		s.erase(p,1); 
	}
	cout<<s;
	return 0;
}
/*
从字符串s中找到所有的字符c,并删除 
*/

/*	Problem: 删除指定字符
	Language: C++	Result: 正确 	Time: 2026-09-18 15:20:14
	User: admin  	Problem: 1876	contest_id: 0*/
#include <iostream>  //二分的模板2: l<=r
#include <algorithm>
using namespace std;
int n,m,c,a[100005],ans;
int main(){
	scanf("%d%d%d",&n,&m,&c);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	sort(a+1,a+n+1);       //到达时间从小到大排序 
	int l=0,r=a[n]-a[1];   //r是可能的最长等待时间,即第1头牛等到最后1头牛到来 
	while(l<=r){
		int mid=(l+r)>>1,cnt=1,s=1; //cnt表示车辆的数量,s表示等第cnt辆车的最早的牛编号 
		for(int i=1;i<=n;i++)
			if(a[i]-a[s]>mid || i-s+1>c){//等待时间超过mid或当前车辆已满
				cnt++; //重新发一辆车
				s=i;   //等待新车的最早的牛编号 
			}
		if(cnt<=m) ans=mid,r=mid-1;  //车辆数充足,则等待时间可以更小
		else l=mid+1;                //车辆数不足,则等待时间需要更长
	}
	printf("%d\n",ans);
	return 0;
}
/*	Problem: 牛吃草大会
	Language: C++	Result: 正确 	Time: 2026-09-17 13:25:00
	User: admin  	Problem: 2540	contest_id: 0*/
#include <iostream>  //二分的模板1: l<r
#include <algorithm>
using namespace std;
int n,m,c,a[100005];
int main(){
	scanf("%d%d%d",&n,&m,&c);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	sort(a+1,a+n+1);       //到达时间从小到大排序 
	int l=0,r=a[n]-a[1];   //r是可能的最长等待时间,即第1头牛等到最后1头牛到来 
	while(l<r){
		int mid=(l+r)>>1,cnt=1,s=1; //cnt表示车辆的数量,s表示等第cnt辆车的最早的牛编号 
		for(int i=1;i<=n;i++)
			if(a[i]-a[s]>mid || i-s+1>c){//等待时间超过mid或当前车辆已满
				cnt++; //重新发一辆车
				s=i;   //等待新车的最早的牛编号 
			}
		if(cnt<=m) r=mid;  //车辆数充足,则等待时间可以更小
		else l=mid+1;      //车辆数不足,则等待时间需要更长
	}
	printf("%d\n",l);
	return 0;
}
/*	Problem: 牛吃草大会
	Language: C++	Result: 正确 	Time: 2026-09-17 13:22:42
	User: admin  	Problem: 2540	contest_id: 0*/
#include<iostream>
using namespace std;
int t,m,b[1010],n[1010];
int fb[1010],fn[1010];
//fb[i]第i个月在北京办公的最大收益,fn[i]第i个月在南京办公的最大收益 
int main(){
	cin>>t>>m;
	for(int i=1;i<=t;i++) cin>>b[i]>>n[i];
	//初始值
	fb[1]=b[1];
	fn[1]=n[1];
	for(int i=2;i<=t;i++){ //状态转移 
		fb[i]=max(fb[i-1]+b[i],fn[i-1]+b[i]-m);  //上个月有两种情况:北京、南京 
		fn[i]=max(fb[i-1]+n[i]-m,fn[i-1]+n[i]);  //上个月有两种情况:北京、南京 
	}
	cout<<max(fb[t],fn[t]); //答案 
	return 0;
}
/*	Problem: 移动办公营业额
	Language: C++	Result: 正确 	Time: 2026-09-12 20:39:27
	User: admin  	Problem: 2401	contest_id: 0*/
#include<iostream>
#include<cstring>
using namespace std;
int ans=0,a,b,c;
int main(){
	cin>>a>>b>>c;
	for(int i=123;i<=987;i++){
		if(i%10==i/10%10 || i%10==i/100 || i/10%10==i/100) continue;//个 十 百位不能相同 
		if(i%10==0 || i/10%10==0 || i/100==0) continue;//个 十 百位不能为0 
		for(int j=123;j<=987;j++){
			if(j%10==j/10%10 || j%10==j/100 || j/10%10==j/100) continue;//个 十 百位不能相同 
			if(j%10==0 || j/10%10==0 || j/100==0) continue;//个 十 百位不能为0 
			if(i%10==j%10 || i%10==j/10%10 || i%10==j/100) continue;//i的个位 不能和 j的个十百位相同 
			if(i/10%10==j%10 || i/10%10==j/10%10 || i/10%10==j/100) continue;//i的十位 不能和 j的个十百位相同 
			if(i/100%10==j%10 || i/100%10==j/10%10 || i/100%10==j/100) continue;//i的百位 不能和 j的个十百位相同 
			for(int k=123;k<=987;k++){
				if(k%10==k/10%10 || k%10==k/100 || k/10%10==k/100) continue;//个 十 百位不能相同 
				if(k%10==0 || k/10%10==0 || k/100==0) continue;//个 十 百位不能为0 
				if(i%10==k%10 || i%10==k/10%10 || i%10==k/100) continue;//i的个位 不能和 k的个十百位相同 
				if(i/10%10==k%10 || i/10%10==k/10%10 || i/10%10==k/100) continue;//i的十位 不能和 k的个十百位相同 
				if(i/100%10==k%10 || i/100%10==k/10%10 || i/100%10==k/100) continue;//i的百位 不能和 k的个十百位相同 
				if(j%10==k%10 || j%10==k/10%10 || j%10==k/100) continue;//j的个位 不能和 k的个十百位相同 
				if(j/10%10==k%10 || j/10%10==k/10%10 || j/10%10==k/100) continue;//j的十位 不能和 k的个十百位相同 
				if(j/100%10==k%10 || j/100%10==k/10%10 || j/100%10==k/100) continue;//j的百位 不能和 k的个十百位相同 
				if(i*b==j*a && i*c==k*a && j*c==k*b){
					cout<<i<<" "<<j<<" "<<k<<endl;
					ans++; //方案数+1 
				}
			}
		}
	}
	if(ans==0) cout<<"No!!!"; 
	return 0;
}

/*	Problem: 组成三位数(加强)
	Language: C++	Result: 正确 	Time: 2026-09-12 15:59:39
	User: admin  	Problem: 2343	contest_id: 0*/
#include<iostream>
#include<cstring>
using namespace std;
int ans=0,a,b,c;
int main(){
	cin>>a>>b>>c;
	for(int i=123;i<=987;i++){
		if(i%10==i/10%10 || i%10==i/100 || i/10%10==i/100) continue;//个 十 百位不能相同 
		if(i%10==0 || i/10%10==0 || i/100==0) continue;//个 十 百位不能为0 
		for(int j=123;j<=987;j++){
			if(j%10==j/10%10 || j%10==j/100 || j/10%10==j/100) continue;//个 十 百位不能相同 
			if(j%10==0 || j/10%10==0 || j/100==0) continue;//个 十 百位不能为0 
			if(i%10==j%10 || i%10==j/10%10 || i%10==j/100) continue;
			if(i/10%10==j%10 || i/10%10==j/10%10 || i/10%10==j/100) continue;
			if(i/100%10==j%10 || i/100%10==j/10%10 || i/100%10==j/100) continue;
			for(int k=123;k<=987;k++){
				if(k%10==k/10%10 || k%10==k/100 || k/10%10==k/100) continue;//个 十 百位不能相同 
				if(k%10==0 || k/10%10==0 || k/100==0) continue;//个 十 百位不能为0 
				if(i%10==k%10 || i%10==k/10%10 || i%10==k/100) continue;
				if(i/10%10==k%10 || i/10%10==k/10%10 || i/10%10==k/100) continue;
				if(i/100%10==k%10 || i/100%10==k/10%10 || i/100%10==k/100) continue;
				if(j%10==k%10 || j%10==k/10%10 || j%10==k/100) continue;
				if(j/10%10==k%10 || j/10%10==k/10%10 || j/10%10==k/100) continue;
				if(j/100%10==k%10 || j/100%10==k/10%10 || j/100%10==k/100) continue;
				if(i*b==j*a && i*c==k*a && j*c==k*b){
					cout<<i<<" "<<j<<" "<<k<<endl;
					ans++; //方案数+1 
				}
			}
		}
	}
	if(ans==0) cout<<"No!!!"; 
	return 0;
}
/*	Problem: 组成三位数(加强)
	Language: C++	Result: 正确 	Time: 2026-09-12 15:50:55
	User: admin  	Problem: 2343	contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0,a[4010]={6,2,5,5,4,5,6,3,7,6};
//a[i]表示数字i用了多少根火柴棒 
int main(){
	cin>>n;
	for(int i=10;i<=4000;i++) a[i]=a[i/10]+a[i%10];
	for(int i=0;i<=2000;i++){ //枚举加数1 
		for(int j=0;j<=2000;j++){ //枚举加数2 
			int k=i+j; //和为k
			if(a[i]+a[j]+a[k]+4==n){ //火柴棒数量判断 
				ans++; //方案数+1
				//cout<<i<<"+"<<j<<"="<<k<<endl;  观察结果的范围 
			} 
		}
	} 
	cout<<ans; 
	return 0;
}
/*
枚举要素是什么? 枚举加数1和加数2 
每个枚举要素的范围是什么? 
*/

/*	Problem: 火柴棒等式
	Language: C++	Result: 正确 	Time: 2026-09-12 15:16:37
	User: admin  	Problem: 1553	contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0;
int main(){
	cin>>n;
	for(int i=0;i<=n;i++){ //枚举a1 
		for(int j=0;j<=n;j++){ //枚举a2 
			for(int k=0;k<=n;k++){ //枚举a3 
				if((i+j)%2==0 && (j+k)%3==0 && (i+j+k)%5==0){
					//cout<<i<<" "<<j<<" "<<k<<endl; 
					ans=max(ans,i+j+k); //取满足要求的最大值 
				} 
			} 
		}
	}
	cout<<ans; 
	return 0;
}
/*	Problem: 数字方格
	Language: C++	Result: 正确 	Time: 2026-09-12 14:47:54
	User: admin  	Problem: 1806	contest_id: 0*/
#include<iostream>
using namespace std;
string a,b,c;
int main(){
	while(getline(cin,a)){
		getline(cin,b);
		getline(cin,c);
		a=" "+a+" "; //在一句话的首尾都加上空格,这样每个单词前后都有空格了
		b=" "+b+" "; 
		c=" "+c+" "; 
		while(a.find(b)!=-1){//在a里面找到了b 
			int p=a.find(b);
			a.replace(p,b.size(),c); //从位置p开始,替换掉b的长度,替换为c 
		}
		a.erase(0,1);//在输出前,擦除掉最前面的一个空格 
		cout<<a<<endl; 
	}
	return 0;
}
/*	Problem: 单词替换
	Language: C++	Result: 正确 	Time: 2026-09-12 14:30:25
	User: admin  	Problem: 1667	contest_id: 0*/
#include<iostream>  //解法2:用find函数 
using namespace std;
string s,t;
int flag;
int main(){
	getline(cin,s); //输入带空格的字符串s
	getline(cin,t);
	int p=s.find(t); //从头开始找 
	if(p==-1){//string::npos是一个常数,即-1 
		cout<<p; 
	}else{
		while(p!=-1){
			cout<<p+1<<endl;
			p=s.find(t,p+1);//已经找到的位置,往后推一个位置,继续查找(从指定位置开始找) 
		} 
	}
	return 0;
}
/*	Problem: 求子串的位置
	Language: C++	Result: 正确 	Time: 2026-09-12 14:18:55
	User: admin  	Problem: 1873	contest_id: 0*/
#include<iostream>
using namespace std;
string s,t;
int flag;
int main(){
	getline(cin,s); //输入带空格的字符串s
	getline(cin,t);
	for(int i=0;i<s.size();i++){
		string ss=s.substr(i,t.size());//以i为起点,取一个长度为t.size的子串
		if(ss==t){
			cout<<i+1<<endl;
			flag=1; //表示已经找到了至少一个子串位置 
		} 
	} 
	if(!flag) cout<<-1; //flag还是0 
	return 0;
}
/*
在s从前往后以每个字符i作为起点,取出一个子串(该子串的长度为t的长度)ss;
只需要比较ss是否等于t,如果等于则输出字符的位置i 
*/
/*	Problem: 求子串的位置
	Language: C++	Result: 正确 	Time: 2026-09-12 14:08:18
	User: admin  	Problem: 1873	contest_id: 0*/
#include<iostream>
#include<cmath>
using namespace std;
long long n,ans=0;
int main(){
	cin>>n;
	for(long long i=1;i<=sqrt(n);i++){
		if(n%i==0){ //i是n的因子 
			ans+=2; //因数个数+2,因子是成对的 
		}
		
		if(i*i==n) ans--; //n正好是完全平方数,所以因子多算了一个,这里减去 
	} 
	
	cout<<ans; 
	return 0;
}
/*	Problem: 因数个数
	Language: C++	Result: 正确 	Time: 2026-09-12 11:27:34
	User: admin  	Problem: 1088	contest_id: 0*/
#include<iostream>
#include<iomanip>
#include<cmath> 
using namespace std;
int main(){
	double a,b,c; 
	cin>>a>>b>>c;
	if(a+b<=c || a+c<=b || b+c<=a){
		cout<<"false";  //不能构成三角形
		return 0; //程序结束 
	} 
	double p=(a+b+c)/2;//周长的一半 
	double s=sqrt(p*(p-a)*(p-b)*(p-c));//面积:海伦公式 
	cout<<setprecision(1)<<fixed<<s;
	return 0;
}
/*	Problem: 判断并求三角形的面积
	Language: C++	Result: 正确 	Time: 2026-09-12 11:05:18
	User: admin  	Problem: 1062	contest_id: 0*/
#include<iostream>
#include<iomanip>
#include<cmath> 
using namespace std;
int main(){
	double a,b,c; 
	cin>>a>>b>>c;
	double p=(a+b+c)/2;//周长的一半 
	double s=sqrt(p*(p-a)*(p-b)*(p-c));//面积 
	cout<<setprecision(2)<<fixed<<s;
	return 0;
}
/*	Problem: 求三角形面积
	Language: C++	Result: 正确 	Time: 2026-09-12 10:58:19
	User: admin  	Problem: 1030	contest_id: 0*/
#include<iostream>
#include<iomanip>
#include<cmath> 
using namespace std;
int main(){
	double x1,x2,y1,y2; //注意y1不要做全局变量 
	cin>>x1>>y1>>x2>>y2;
	double a=x1-x2;
	double b=y1-y2;
	double c=sqrt(a*a+b*b);//勾股定理 
	cout<<setprecision(3)<<fixed<<c;
	return 0;
}
/*	Problem: 平面直角坐标系中两点的距离
	Language: C++	Result: 正确 	Time: 2026-09-12 10:42:17
	User: admin  	Problem: 1042	contest_id: 0*/
#include<iostream>
using namespace std;
bool prime(int x){//判断整数x是否是质数,是返回true,不是返回false 
	for(int i=2;i*i<=x;i++){ //枚举到x的平方根 
		if(x%i==0){
			return false; //有因子,不是质数 
		} 
	} 
	return true; //循环结束,都没有找到n的因数 
}
int n,cnt=0;
int main(){
	cin>>n;
	for(int i=2;i<=n;i++){//枚举2~n的所有数字 
		if(prime(i)){//i是质数 
			cout<<i<<" "; 
			cnt++; //质数个数+1
			if(cnt%5==0) cout<<endl; 
		} 
	}
	return 0;
}
/*	Problem: n以内的全部素数
	Language: C++	Result: 正确 	Time: 2026-09-12 10:22:19
	User: admin  	Problem: 1083	contest_id: 0*/
#include<iostream>
using namespace std;
bool prime(int x){//判断整数x是否是质数,是返回true,不是返回false 
	for(int i=2;i*i<=x;i++){ //枚举到x的平方根 
		if(x%i==0){
			return false; //有因子,不是质数 
		} 
	} 
	return true; //循环结束,都没有找到n的因数 
}
int n;
int main(){
	scanf("%d",&n);
	for(int i=2;i<=n/2;i++){//枚举一个加数 
		int j=n-i; //直接算出另外一个加数
		if(prime(i)&&prime(j)){
			printf("%d=%d+%d\n",n,i,j); 
		} 
	} 
	return 0;
}
/*	Problem: 哥德巴赫猜想
	Language: C++	Result: 正确 	Time: 2026-09-12 10:14:21
	User: admin  	Problem: 1156	contest_id: 0*/
#include<iostream>  //解法2
using namespace std;
bool prime(int x){//判断整数x是否是质数,是返回true,不是返回false 
	for(int i=2;i*i<=x;i++){ //枚举到x的平方根 
		if(x%i==0){
			return false; //有因子,不是质数 
		} 
	} 
	return true; //循环结束,都没有找到n的因数 
}
int n,ans=0;
int main(){
	cin>>n;
	if(prime(n)) cout<<"YES";
	else cout<<"NO";
	return 0;
}
/*	Problem: 判断质数(素数)
	Language: C++	Result: 正确 	Time: 2026-09-12 10:05:02
	User: admin  	Problem: 1152	contest_id: 0*/
#include<iostream>  //解法1 
using namespace std;
bool prime(int x){//判断整数x是否是质数,是返回true,不是返回false 
	for(int i=2;i<x;i++){ //枚举2~n-1,判断是否有n的因数 
		if(x%i==0){
			return false; //有因子,不是质数 
		} 
	} 
	return true; //循环结束,都没有找到n的因数 
}
int n,ans=0;
int main(){
	cin>>n;
	if(prime(n)) cout<<"YES";
	else cout<<"NO";
	return 0;
}
/*	Problem: 判断质数(素数)
	Language: C++	Result: 正确 	Time: 2026-09-12 09:58:34
	User: admin  	Problem: 1152	contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0;
int main(){
	cin>>n;
	for(int i=n+1;;i++){ //枚举范围:n+1 n+2 n+3 ... ,直到正好找到一个各位数字之和为20的数字,则结束 
		int g=i%10;
		int s=i/10%10;
		int b=i/100%10;
		int q=i/1000%10;
		if(g+s+b+q==20){
			cout<<i;
			break; //或者 return 0;
		}
	} 
	return 0;
}
/*	Problem: 寻找特殊年号.
	Language: C++	Result: 正确 	Time: 2026-09-11 20:31:31
	User: admin  	Problem: 2751	contest_id: 0*/
#include<iostream>
using namespace std;
int n,m=0;
int main(){
	cin>>n;
	for(int i=10;i<=31;i++){//枚举完全平方数 
		int x=i*i; //完全平方数 
		int g=x%10;
		int s=x/10%10;
		int b=x/100%10;
		if(g==s || g==b || s==b){ //有两位数字是相同的 
			m++;  //每找到1个,则计数 
			if(n==m){ //寻找第n个满足条件的
				cout<<x;
				return 0; //已经找到答案,结束 
			} 
		} 
	}
	return 0;
}
/*	Problem: 求满足条件的3位数.
	Language: C++	Result: 正确 	Time: 2026-09-11 20:14:48
	User: admin  	Problem: 3937	contest_id: 0*/

重要提示:代码要自己写!

操作被阻止:禁止复制/粘贴/点击!