开始: 2022-08-19 00:00:00

2022summer13

结束: 2022-08-19 00:00:00
当前: 2025-0505-3131 13:55:41  类型:IOI 状态:已经结束 

#include <bits/stdc++.h>
using namespace std;
int n,k,ans;
int a[21];
bool check(int x)
{
for(int i=2;i*i<=x;i++) if(x%i==0) return 0;
return 1;
}
void search(int x,int sum,int cnt)
{
if(cnt+n-x+1<k) return;//就算后面的全选也凑不够k个
if(x==n+1&&cnt==k)
{
if(check(sum)) ans++;//若sum是素数
return;
}
if(cnt<k) search(x+1,sum+a[x],cnt+1);//只有在没选够k个时才能选
search(x+1,sum,cnt);//不选
}
int main()
{
freopen("number.in","r",stdin);
freopen("number.out","w",stdout);
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
search(1,0,0);
printf("%d",ans);
return 0;
}

 

#include <bits/stdc++.h>
using namespace std;
int n, k, a, b, c;
int x[100010],y[100010];
int main()
{
freopen("paste.in","r",stdin);
freopen("paste.out","w",stdout);
cin >> n >> k;
for(int i = 1; i <= n; i++) x[i]=i;
for(int i = 1; i <= k; i++)
{
cin >> a >> b >> c;
int now=0;
int t=1;
while(t<=n)
{
if(now==c) break;
if(t>=a&&t<=b)
{
t++;
continue;
}
now++;
y[now]=x[t];
t++;
}
for(int j=a;j<=b;j++) y[++now]=x[j];
while(t<=n)
{
if(t>=a&&t<=b)
{
t++;
continue;

}
now++;
y[now]=x[t];
t++;
}
for(int j=1;j<=n;j++) x[j]=y[j];
}
for(int i = 1; i <= 10; i++) cout << x[i] << endl;
return 0;
}

 

#include<bits/stdc++.h>
using namespace std;
int at[20005],n,cnt,maxx,t,Begin,End;
char k[20005],m[20005]; //k为原字符串,m为新字符串
int able(int o) //计算回文串长度
{
int a1=1,a2=0;
int i=o-1,j=o+1;//奇数长度回文串中两边对称字符的编号
while(i>=0&&j<cnt&&m[i]==m[j])
{
//如果i和j在范围内且满足回文条件
a1+=2;
i--;
j++;
}
i=o; j=o+1;//偶数长度回文串中两边对称字符的编号
while(i>=0&&j<cnt&&m[i]==m[j])
{
a2+=2;
i--;
j++;
}
return max(a1,a2);//取最大值
}
int main()
{
freopen("max.in","r",stdin);
freopen("max.out","w",stdout);
gets(k);
n=strlen(k);
for(int i=0; i<n; i++)
{
if((k[i]>='a'&&k[i]<='z')||(k[i]>='A'&&k[i]<='Z'))//如果这个字符是字母
{
if(k[i]>='A'&&k[i]<='Z') m[cnt]=k[i]-'A'+'a';
else m[cnt]=k[i];//m做为新字符串 只存储字母 且全转化为小写
at[cnt]=i;//at保存新字符串向原字符串的映射位置
cnt++;
}
}
for(int i=0; i<cnt; i++)
{
t=able(i);//计算以i为中心(或中心偏左)s的回文串长度
if(t>maxx)
{
maxx=t; //保存回文最大值
if(maxx%2==0) Begin=i-t/2+1;
else Begin=i-t/2;
End=i+t/2;
}
}
cout<<maxx<<endl;
for(int i=at[Begin];i<=at[End];i++) cout<<k[i];//输出原字符串
return 0;
}