基本算法
洛谷题库
枚举 P2241 统计方形(数据加强版)
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long n,m,i,j,sum=0,sum1=0;
cin>>n>>m;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
sum+=min(i,j);
sum1+=i*j;
}
}
cout<<sum<<" "<<sum1-sum<<endl;
return 0;
}
贪心 P1803 凌乱的yyy / 线段覆盖
#include<bits/stdc++.h>
using namespace std;
int ans=0;
struct qj
{
long int l;
long int r;
}asd[1000010];
bool vis[1000010]={0};
bool comp(qj a,qj b)
{
if(a.r>b.r) return 0;
else return 1;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>asd[i].l>>asd[i].r;
sort(asd+1,asd+1+n,comp);
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
ans++;
vis[i]=1;
for(int j=i+1;j<=n;j++)
{
if(asd[i].r>asd[j].l)
{
vis[j]=1;/
}
}
}
}
cout<<ans;
return 0;
}
模拟 P1042 [NOIP2003 普及组] 乒乓球
#include <bits/stdc++.h>
using namespace std;
int main(){
char s;
string a;
long long w,l,i;
while(cin>>s && s != 'E')
{
if(s == 'W') {w++;a+=s;}
if(s == 'L') {l++;a+=s;}
if((w >= 11 || l >= 11) && (w - l >=2 || l - w >= 2))
{
cout<<w<<":"<<l<<endl;
w=0;
l=0;
}
i++;
}
cout<<w<<":"<<l<<endl<<endl;
w=0;l=0;
for(int j;j<=i;j++)
{
if(a[j] == 'W') w++;
if(a[j] == 'L') l++;
if((w >= 21 || l >= 21) && (w - l >=2 || l - w >= 2))
{
cout<<w<<":"<<l<<endl;
w=0;
l=0;
}
}
cout<<w<<":"<<l;
}
二分 P1873 [COCI 2011/2012 #5] EKO / 砍树
#include<bits/stdc++.h>
using namespace std;
int a[1000005];
int n, m;
bool check(int k)
{
long long sum = 0;
for (int i = 1; i <= n; i++)
if (a[i] > k)
sum += (long long)(a[i] - k);
return sum >= m;
}
int find() {
int l = 1, r = 1000000001;
while (l + 1 < r)
{
int mid = (l + r) / 2;
if (check(mid))
l = mid;
else
r = mid;
}
return l;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> a[i];
cout << find();
return 0;
}
递归和分治 P1028 [NOIP2001 普及组] 数的计算
#include<bits/stdc++.h>
using namespace std;
int a[1001];
int main()
{
int n;cin>>n;
for(int i=1;i<=1001;i++)
{
for(int j=1;j<=i/2;j++) a[i]+=a[j];
a[i]++;
}
cout<<a[n]<<endl;
}
前缀和与差分 P3397 地毯
#include<bits/stdc++.h>
using namespace std;
int a[1010][1010];
int main()
{
int n,m;cin>>n>>m;
while(m--)
{
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
for(int i=x1;i<=x2;i++)
{
a[i][y1]++;
a[i][y2+1]--;
}
}
for(int i=1;i<=n;i++)
{
cout<<a[i][1];
for(int j=2;j<=n;j++)
{
a[i][j]+=a[i][j-1];
cout<<" "<<a[i][j];
}
if(i<n) cout<<endl;
}
}
字符串
字符串哈希 P3370 【模板】字符串哈希
#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
const int o=1524,oo=10024;
int n,ans;
int len[o],lk[o][oo];
char s[oo][o];
ull base=131,h[oo];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",s[i]+1);
int ln=strlen(s[i]+1);
lk[ln][++len[ln]]=i;
ull k=0;
for(int j=1;j<=ln;j++)
k=k*base+(ull)(s[i][j]-'0');
h[i]=k;
for(int j=1;j<len[ln];j++)
{
int pos=lk[ln][j];
if(h[pos]==k)
{
ans++;
break;
}
}
}
printf("%d\n",n-ans);
return 0;
}
字典树 P2580 于是他错误的点名开始了
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
#define ios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define memset(a,b) memset(a,b,sizeof(a))
#define endl '\n'
typedef long long ll;
typedef unsigned long long ull;
const double pi = acos(-1.0);
const int MOD=1000000007;
const int INF=0x3f3f3f3f;
//10 61109567 21 22219134 0x3f
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
int son[2000010][26],num[2000010],idx;
void insert(char *s)
{
int p=0;
for(int i=0;s[i];i++)
{
int u=s[i]-'a';
if(!son[p][u]) son[p][u]=++idx;
p=son[p][u];
}
num[p]++;
}
int find(char *s)
{
int p=0;
for(int i=0;s[i];i++)
{
int u=s[i]-'a';
if(!son[p][u]) return false;
p=son[p][u];
}
num[p]++;
return num[p];
}
int main()
{
ios;
int n,m;cin>>n;
char s[60];
while(n--)
{
cin>>s;
insert(s);
}
cin>>m;
while(m--)
{
cin>>s;
if(find(s)==2) cout<<"OK";
else if(find(s)>2) cout<<"REPEAT";
else cout<<"WRONG";
cout<<endl;
}
}
Manacher算法 P3805 【模板】manacher 算法
#include<bits/stdc++.h>
#define N 31000010
using namespace std;
int n,p[N],ans;
char s[N],str[N];
void manachar(){
int mx=0,id;
for(int i=n;str[i]!=0;i++)str[i]=0;
for(int i=1;i<n;i++){
if(mx>i)p[i]=min(p[2*id-i],p[id]+id-i);
else p[i]=1;
for (;str[i+p[i]]==str[i-p[i]];++p[i]);
if (p[i]+i>mx){mx=p[i]+i;id=i;}
}
}
void init(){
str[0]='#';str[1]='#';
for(int i=0;i<n;i++)str[(i<<1)+2]=s[i],str[(i<<1)+3]='#';
n=(n<<1)+2;str[n]=0;
}
int main(){
scanf("%s",s);
n=strlen(s);init();manachar();
ans=0;
for(int i=0;i<n;i++)ans=max(ans,p[i]);
printf("%d\n",ans-1);
}
KMP P3375 【模板】KMP字符串匹配
#include<bits/stdc++.h>
#define MAXN 1000010
using namespace std;
int kmp[MAXN];
int la,lb,j;
char a[MAXN],b[MAXN];
int main()
{
cin>>a+1;
cin>>b+1;
la=strlen(a+1);
lb=strlen(b+1);
for (int i=2;i<=lb;i++)
{
while(j&&b[i]!=b[j+1])
j=kmp[j];
if(b[j+1]==b[i])j++;
kmp[i]=j;
}
j=0;
for(int i=1;i<=la;i++)
{
while(j>0&&b[j+1]!=a[i])
j=kmp[j];
if (b[j+1]==a[i])
j++;
if (j==lb) {cout<<i-lb+1<<endl;j=kmp[j];}
}
for (int i=1;i<=lb;i++)
cout<<kmp[i]<<" ";
return 0;
}
数据结构
链表 P3613 【深基15.例2】寄包柜
#include<bits/stdc++.h>
using namespace std;
int n,q,p,k;
map<long long,int>b;
long long i,j;
int main()
{
scanf("%d%d",&n,&q);
while(q--)
{
scanf("%d%d%d",&p,&i,&j);
if(p==1)
{
scanf("%d",&k);
b[i*1000000+j]=k;
}
else printf("%d\n",b[i*1000000+j]);
}
return 0;
}
栈 P1427 小鱼的数字游戏
#include<bits/stdc++.h>
using namespace std;
int a[101];
int top=0,c;
int main(){
while(1){
cin>>c;
if(c==0) break;
a[++top]=c;
}
while(top!=0){
cout<<a[top--]<<" ";
}
return 0;
}
队列 P1540 [NOIP2010 提高组] 机器翻译
#include<bits/stdc++.h>
#include<iostream>
#include<queue>
using namespace std;
queue<int> q;
int m,n,ans;
bool inq[1010];
int main()
{
cin>>m>>n;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
if(inq[x])continue;
else
{
if(q.size()>=m)
{
inq[q.front()]=false;
q.pop();
}
q.push(x);
inq[x]=true;
ans++;
}
}
cout<<ans;
return 0;
}
并查集 P1551 亲戚
#include<bits/stdc++.h>
using namespace std;
int s[10009];
int find(int x)
{
int r=x;
while(s[r]!=r)
r=s[r];
return r;
}
int main()
{
std::ios::sync_with_stdio(false);
int n,m,k;
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
s[i]=i;
while(m--)
{
int x,y;cin>>x>>y;
s[find(x)]=find(y);
}
while(k--)
{
int x,y;cin>>x>>y;
if(find(x)==find(y))
{
puts("Yes");
}
else
{
puts("No");
}
}
}
树状数组 P3374 【模板】树状数组 1
#include<bits/stdc++.h>
using namespace std;
int n,m,tree[2000010];
int lowbit(int k)
{
return k & -k;
}
void add(int x,int k)
{
while(x<=n)
{
tree[x]+=k;
x+=lowbit(x);
}
}
int sum(int x)
{
int ans=0;
while(x!=0)
{
ans+=tree[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int a;
scanf("%d",&a);
add(i,a);
}
for(int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a==1)
add(b,c);
if(a==2)
cout<<sum(c)-sum(b-1)<<endl;
}
}
线段树 P3372 【模板】线段树 1
#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
int a[maxn+2];
struct tree{
int l,r;
long long pre,add;
}t[4*maxn+2];
void bulid(int p,int l,int r){
t[p].l=l;t[p].r=r;
if(l==r){
t[p].pre=a[l];
return;
}
int mid=l+r>>1;
bulid(p*2,l,mid);
bulid(p*2+1,mid+1,r);
t[p].pre=t[p*2].pre+t[p*2+1].pre;
}
void spread(int p){
if(t[p].add){
t[p*2].pre+=t[p].add*(t[p*2].r-t[p*2].l+1);
t[p*2+1].pre+=t[p].add*(t[p*2+1].r-t[p*2+1].l+1);
t[p*2].add+=t[p].add;
t[p*2+1].add+=t[p].add;
t[p].add=0;
}
}
void change(int p,int x,int y,int z){
if(x<=t[p].l && y>=t[p].r){
t[p].pre+=(long long)z*(t[p].r-t[p].l+1);
t[p].add+=z;
return;
}
spread(p);
int mid=t[p].l+t[p].r>>1;
if(x<=mid) change(p*2,x,y,z);
if(y>mid) change(p*2+1,x,y,z);
t[p].pre=t[p*2].pre+t[p*2+1].pre;
}
long long ask(int p,int x,int y){
if(x<=t[p].l && y>=t[p].r) return t[p].pre;
spread(p);
int mid=t[p].l+t[p].r>>1;
long long ans=0;
if(x<=mid) ans+=ask(p*2,x,y);
if(y>mid) ans+=ask(p*2+1,x,y);
return ans;
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
bulid(1,1,n);
for(int i=1;i<=m;i++)
{
int q,x,y,z;
scanf("%d",&q);
if(q==1){
scanf("%d%d%d",&x,&y,&z);
change(1,x,y,z);
}
else {
scanf("%d%d",&x,&y);
cout<<ask(1,x,y)<<endl;
}
}
return 0;
}
图
图的存储
邻接矩阵 P5318 【深基18.例3】查找文献
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
int n,m;
bool b[100005];
vector<int > a[100005];
void dfs(int x,int r)
{
b[x]=true;
if(!r)
{
cout<<x<<' ';
return ;
}
cout<<x<<' ';
for(int i=0;i<a[x].size();i++)
if(!b[a[x][i]]) dfs(a[x][i],r-1);
}
void bfs()
{
queue<int> q;
q.push(1);b[1]=true;
while(!q.empty())
{
int s=q.front(); q.pop();
cout<<s<<' ';
for(int i=0;i<a[s].size();i++) if(b[a[s][i]]==false) q.push(a[s][i]),b[a[s][i]]=true;
}
}
int main()
{
n=read();
m=read();
for(int i=1;i<=m;i++)
{
int x,y;
x=read();
y=read();
a[x].push_back(y);
}
for(int i=1;i<=n;i++)
sort(a[i].begin(),a[i].end());
dfs(1,n);
cout<<endl;
for(int i=1;i<=n;i++) b[i]=false;
bfs();
return 0;
}
邻接表 P1073 [NOIP2009 提高组] 最优贸易
#include<bits/stdc++.h>
#define INF 0x7f7f7f7f
#define MAXN 100005
using namespace std;
vector<int> g[MAXN];
int n,m,f[MAXN],mi[MAXN],c[MAXN];
void dfs(int x,int minx,int pre) {
int flag=1;
minx=min(c[x],minx);
if (mi[x]>minx) mi[x]=minx,flag=0;
int maxx=max(f[pre],c[x]-minx);
if (f[x]<maxx) f[x]=maxx,flag=0;
if (flag) return;
for (int i=0;i<g[x].size();i++) dfs(g[x][i],minx,x);
}
int main() {
scanf("%d%d",&n,&m);
for (int i=0;i<MAXN;i++) mi[i]=INF;
for (int i=1;i<=n;i++) scanf("%d",&c[i]);
for (int i=1;i<=m;i++) {
int t1,t2,t3;
scanf("%d%d%d",&t1,&t2,&t3);
g[t1].push_back(t2);
if (t3==2) g[t2].push_back(t1);
}
dfs(1,INF,0);
printf("%d\n",f[n]);
return 0;
}
深度优先搜索 P4017 最大食物链计数
#include<bits/stdc++.h>
using namespace std;
const int N=6005,M=500005,mod=80112002;
#define ll long long
ll n,m,ft[N],nx[M],to[M],f[N],rd[N],ans;
bool st[N];
inline long long read()
{
char c=getchar();long long sum=0,f=1;
while(!(c>='0'&&c<='9')) {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') {sum=((sum<<1)+(sum<<3))+(c-'0');c=getchar();}
return sum*f;
}
void dfs(ll x)
{
if(!rd[x])
{
if(!ft[x])
{
ans=(ans%mod+f[x]%mod)%mod;
return;
}
else for(ll i=ft[x];i;i=nx[i])
{
rd[to[i]]--;
f[to[i]]=(f[to[i]]%mod+f[x]%mod)%mod;
dfs(to[i]);
}
}
return;
}
int main()
{
n=read();m=read();
for(int i=1;i<=m;i++)
{
ll a=read(),b=read();
rd[b]++;
nx[i]=ft[a];
ft[a]=i;
to[i]=b;
}
for(int i=1;i<=n;i++) if(!rd[i]) st[i]=1;
for(int i=1;i<=n;i++) if(st[i]) f[i]=1,dfs(i);
cout<<ans%mod;
return 0;
}
广度优先搜索 P6691 选择题
#include<bits/stdc++.h>
using namespace std;
void read(int &x){
int f=1;x=0;
char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') { x=x*10+ch-'0';ch=getchar();}
x*=f;
}
#define N 1000010
#define Mod 998244353
int n,tot;//全局部分
int v[N],d[N],flag;//判无解用 , d[i] 表示 i 点正误相对情况
int ans1;//有多少个块
int ansmx,ansmn;//最多答案和最少答案
int pow(int x,int y){//快速幂部分
int ans=1;
for(;y;y>>=1){
if(y&1) ans=((long long)ans*x)%Mod;
x=((long long)x*x)%Mod;
}
return ans%Mod;
}
int head[N],ne[N<<1],to[N<<1],sz[N<<1];//建森林部分
void add(int x,int y,int opt){
to[++tot]=y,ne[tot]=head[x],sz[tot]=!opt,head[x]=tot;
}
int q[N<<1],hed,tail,now;//bfs 部分
void bfs(int x){
hed=tail=0;//队首和队尾
now=0;
q[++tail]=x;
while(hed<tail){
hed++;
x=q[hed];//取出队首
v[x]=1;//已经访问过
for(int i=head[x];i;i=ne[i]){
int y=to[i];
if(v[y]){//如果已经访问过且出现矛盾,判无解
if(d[x]^sz[i]!=d[y]){//我用 sz[] 记录边权
flag=1;return ;
}
continue;
}
d[y]=d[x]^sz[i];//每访问过,更新真假性
q[++tail]=y;//入队
v[y]=1;//已经访问过
now+=d[y];//暂时先别管
}
}
}
int main(){
read(n);
for(int i=1;i<=n;i++){
int x,opt;
read(x),read(opt);
add(i,x,opt),add(x,i,opt);
}
for(int i=1;i<=n;i++){
if(!v[i]){
bfs(i);
ans1++;
if(flag){
printf("No answer");
return 0;
}
ansmx+=max(tail-now,now);
ansmn+=min(tail-now,now);
}
}
printf("%d\n%d\n%d",pow(2,ans1),ansmx,ansmn);
}
最短路算法
Dijkstra算法 P3371 【模板】单源最短路径(弱化版)
#include<bits/stdc++.h>
const long long inf=2147483647;
const int maxn=10005;
const int maxm=500005;
using namespace std;
int n,m,s,num_edge=0;
int dis[maxn],vis[maxn],head[maxm];
struct Edge
{
int next,to,dis;
}edge[maxm]; //结构体表示静态邻接表
void addedge(int from,int to,int dis) //邻接表建图
{ //以下是数据结构书上的标准代码,不懂翻书看解释
edge[++num_edge].next=head[from]; //链式存储下一条出边
edge[num_edge].to=to; //当前节点编号
edge[num_edge].dis=dis; //本条边的距离
head[from]=num_edge; //记录下一次的出边情况
}
void spfa()
{
queue<int> q; //spfa用队列,这里用了STL的标准队列
for(int i=1; i<=n; i++)
{
dis[i]=inf; //带权图初始化
vis[i]=0; //记录点i是否在队列中,同dijkstra算法中的visited数组
}
q.push(s); dis[s]=0; vis[s]=1; //第一个顶点入队,进行标记
while(!q.empty())
{
int u=q.front(); //取出队首
q.pop(); vis[u]=0; //出队标记
for(int i=head[u]; i; i=edge[i].next) //邻接表遍历,不多解释了(也可用vector代替)
{
int v=edge[i].to;
if(dis[v]>dis[u]+edge[i].dis) //如果有最短路就更改
{
dis[v]=dis[u]+edge[i].dis;
if(vis[v]==0) //未入队则入队
{
vis[v]=1; //标记入队
q.push(v);
}
}
}
}
}
int main()
{
cin>>n>>m>>s;
for(int i=1; i<=m; i++)
{
int f,g,w;
cin>>f>>g>>w;
addedge(f,g,w); //建图,有向图连一次边就可以了
}
spfa(); //开始跑spfa
for(int i=1; i<=n; i++)
if(s==i) cout<<0<<" "; //如果是回到自己,直接输出0
else cout<<dis[i]<<" "; //否则打印最短距离
return 0;
}
Floyd算法 P6175 无向图的最小环问题
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int inf = 1e13;
int n,m,u,v,w,ans = inf;
int dis[128][128];
int mp[128][128];
signed main(void){
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j)dis[i][j]=mp[i][j]=inf;
for(int i=1;i<=m;i++){
cin>>u>>v>>w;
dis[u][v]=min(dis[u][v],w);
dis[v][u]=min(dis[v][u],w);
mp[u][v]=min(mp[u][v],w);
mp[v][u]=min(mp[v][u],w);
}
for(int k=1;k<=n;k++){
for(int i=1;i<k;i++)
for(int j=i+1;j<k;j++)
ans = min(ans,dis[i][j]+mp[i][k]+mp[k][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
dis[i][j] = min(dis[i][j],dis[i][k]+dis[k][j]);
dis[j][i] = dis[i][j];
}
}
if(ans==inf)cout<<"No solution.";
else cout<<ans;
return 0;
}
动态规划
线性dp P1439 【模板】最长公共子序列
#include<bits/stdc++.h>
using namespace std;
int len=0;
int a[100001],p[100001],f[100001];
int bound(int x)
{
int L=1,R=len;
while(L<R)
{
int mid=(L+R)>>1;
if(p[f[mid]]>p[x])
R=mid;
else
L=mid+1;
}
return L;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
p[x]=i;
}
for(int i=1;i<=n;i++)
{
if(p[a[i]]>p[f[len]])
f[++len]=a[i];
else
f[bound(a[i])]=a[i];
}
cout<<len<<endl;
return 0;
}
背包问题 P1060 [NOIP2006 普及组] 开心的金明
#include<bits/stdc++.h>
using namespace std;
int w[30],v[30],f[50000];
int n,m;
int main()
{
cin>>m>>n;
for(int i=1;i<=n;i++)
{
cin>>v[i]>>w[i];
w[i]*=v[i];
}
for(int i=1;i<=n;i++)
{
for(int j=m;j>=v[i];j--)
{
if(j>=v[i])
{
f[j]=max(f[j],f[j-v[i]]+w[i]);
}
}
}
cout<<f[m]<<endl;
return 0;
}
数学
位运算 P1100 高低位交换
#include<bits/stdc++.h>
using namespace std;
int main()
{
unsigned long long x;
cin>>x;
cout<<((x&0x0000ffff)<<16|(x&0xffff0000)>>16)<<endl;
}
快速幂 P1226 【模板】快速幂||取余运算
#include<bits/stdc++.h>
using namespace std;
int main(){
int b,d;
long long ans,a,k,c;
scanf("%lld%d%lld",&a,&b,&k);
c=a;
d=b;
ans=1%k;
while(b){
if(b%2){
ans=(ans*a)%k;
}
a=(a*a)%k;
b/=2;
}
printf("%lld^%d mod %lld=%lld",c,d,k,ans);
return 0;
}
欧几里得算法 P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,sum=0;cin>>m>>n;
if(n==m) sum--;
n*=m;
for(int i=1;i<=sqrt(n);i++)
if(n%i==0&&__gcd(i,n/i)==m) sum+=2;
cout<<sum<<endl;
return 0;
}
素数筛 P5736 【深基7.例2】质数筛
#include<bits/stdc++.h>
bool isPrime[100000010];
int Prime[6000010], cnt = 0;
void GetPrime(int n)
{
memset(isPrime, 1, sizeof(isPrime));
isPrime[1] = 0;
for(int i = 2; i <= n; i++)
{
if(isPrime[i])
Prime[++cnt] = i;
for(int j = 1; j <= cnt && i*Prime[j] <= n; j++)
{
isPrime[i*Prime[j]] = 0;
if(i % Prime[j] == 0)
break;
}
}
}
int main()
{
int n, q;
scanf("%d %d", &n, &q);
GetPrime(n);
while (q--)
{
int k;
scanf("%d", &k);
printf("%d\n", Prime[k]);
}
return 0;
}
简单博弈 P2197 【模板】nim 游戏
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;cin>>t;
while(t--)
{
int n;cin>>n;int temp=0;
for(int i=0;i<n;i++)
{
int a;
cin>>a;
temp=temp^a;
}
if(!temp) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
return 0;
}