http://acm.nyist.me/OJ/contest_problemset.php?cid=1036
祝我们节日快乐☺!!!
A题
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
long long a=0,b=0,x;
while(n--)
{
scanf("%lld",&x);
if(x%2==1) a+=x;
else b+=x;
}
printf("%lld %lld\n",a,b);
}
}
B题:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a[1100];
int main()
{
memset(a,0,sizeof(a));
a[0]=1;
a[1]=1;
for(int i=2;i<=1000;i++)
{
if(!a[i])
for(int j=i*2;j<=1000;j+=i)
a[j]=1;
}
int n;
while(~scanf("%d",&n)&&n)
{
if(!a[n])printf("YES\n");
else printf("NO\n");
}
}
C题:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
LL a[1000];
int main()
{
a[3]=a[2]=a[1]=1LL;
LL n;
while(~scanf("%lld",&n))
{
int i=1;
while(a[i]!=n)
{
i++;
if(i>=4)
a[i]=a[i-1]+a[i-2]+a[i-3];
}
printf("%d\n",i);
}
}
D题:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
int main()
{
char s[210];
while(~scanf("%s",s))
{
int l=strlen(s);
int x=0;
for(int i=0;i<l-3;i++)
{
if((s[i]=='r'||s[i]=='R')&&(s[i+1]=='i'||s[i+1]=='I')&&(s[i+2]=='b'||s[i+2]=='B')&&(s[i+3]=='a'||s[i+3]=='A'))
x++;
}
printf("%d\n",x);
}
}
E题:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
int main()
{
int x,y,t;
while(~scanf("%d%d%d",&x,&y,&t))
{
printf("%d\n",(3600*x-y)*t);
}
}
//F题:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
int a[100];
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=n-1;i>=0;i--)
{
for(int j=i-1;j>=0;j--)
{
if(a[i]==a[j])
a[j]=0;
}
}
for(int i=0;i<n-1;i++)
{
if(a[i]!=0)
printf("%d ",a[i]);
}
printf("%d\n",a[n-1]);
}
}
G题:找到每个数字的特点
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
char s[100];
int a[100];
char b[10][6];
int main()
{
while(scanf("%s",s))
{
int ls=strlen(s);
if(ls==1&&s[0]=='0') return 0;
int la=0;
for(int i=ls-1;i>=0;i--)
a[la++]=s[i]-'0';
for(int i=1;i<=7;i++)
scanf("%s",b[i]+1);
int x;
if(b[4][1]=='#'&&b[4][2]=='.') x=0;
if(b[1][1]=='.') x=1;
if(b[5][1]=='#'&&b[2][1]=='.') x=2;
if(b[2][1]=='.'&&b[5][1]=='.'&&b[4][1]=='#') x=3;
if(b[7][1]=='.'&&b[4][1]=='#') x=4;
if(b[2][5]=='.'&&b[5][1]=='.') x=5;
if(b[2][5]=='.'&&b[5][1]=='#') x=6;
if(b[4][1]=='.'&&b[1][1]=='#') x=7;
if(b[2][1]=='#'&&b[4][2]=='#'&&b[5][1]=='#'&&b[2][5]=='#'&&b[5][5]=='#') x=8;
if(b[2][1]=='#'&&b[2][5]=='#'&&b[7][1]=='#'&&b[5][1]=='.') x=9;
a[0]+=x;
int j=0;
while(a[j]>=10)
{
a[j]%=10;
a[++j]++;
}
if(a[la]) printf("%d",a[la]);
for(int i=la-1;i>=0;i--)
printf("%d",a[i]);
printf("\n");
}
}
或者下面的代码:
#include <bits/stdc++.h>
using namespace std;
string add(string s1,string s2)
{
if(s1.length()<s2.length())
{
string temp=s1;
s1=s2;
s2=temp;
}
int i,j;
for(i=s1.length()-1,j=s2.length()-1; i>=0; i--,j--)
{
s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));
if(s1[i]-'0'>=10)
{
s1[i]=char((s1[i]-'0')%10+'0');
if(i) s1[i-1]++;
else s1='1'+s1;
}
}
return s1;
}
string str[10];
int main()
{
string s1,s2;
while(cin>>s1&&s1!="0")
{
for(int i=0; i<7; i++)
cin>>str[i];
int sum=0;
for(int i=0; i<7; i++)
for(int j=0; j<5; j++)
if(str[i][j]=='#')
sum++;
if(sum==7) s2="1";
else if(sum==20) s2="0";
else if(sum==23) s2="8";
else if(sum==11) s2="7";
else if(sum==14) s2="4";
else if(sum==19)
{
if(str[1][4]=='#')
{
if(str[5][4]=='#') s2="3";
else s2="2";
}
else s2="5";
}
else if(sum==21)
{
if(str[1][4]=='#') s2="9";
else s2="6";
}
cout<<add(s1,s2)<<endl;
}
return 0;
}
H题:A+B
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
int b[100],lb;
void fenjie(int x)//把数字分解,然后存进b数组中
{
if(x<0) x=-x;//去掉符号
int k[15];
int lk=0;
if(x==0) k[lk++]=0;//如果数字为0要存入0!!!!!
while(x)//倒叙
{
k[lk++]=x%10;
x/=10;
}
for(int i=lk-1; i>=0; i--)
b[lb++]=k[i];//再到着存入b中
return ;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
lb=0;
int A,B,C;
scanf("%d%d",&A,&B);
C=A+B;
if(A<0) b[lb++]=11;//控制A的符号
fenjie(A);
if(B<0) b[lb++]=11;//控制B的符号,不是负号就是正号。
else b[lb++]=10;//10表示'+',11表示'-',12表示'=';
fenjie(B);
b[lb++]=12;//输出等号
if(C<0) b[lb++]=11;//控制C的符号
fenjie(C);
//b数组中存输出顺序
for(int i=0;i<7;i++)
{
for(int j=0;j<lb;j++)
{
if(j) printf(".");
if(b[j]==0)
{
if(i==0) printf("#####");
if(i==1) printf("#...#");
if(i==2) printf("#...#");
if(i==3) printf("#...#");
if(i==4) printf("#...#");
if(i==5) printf("#...#");
if(i==6) printf("#####");
}
if(b[j]==1)
{
if(i==0) printf("....#");
if(i==1) printf("....#");
if(i==2) printf("....#");
if(i==3) printf("....#");
if(i==4) printf("....#");
if(i==5) printf("....#");
if(i==6) printf("....#");
}
if(b[j]==2)
{
if(i==0) printf("#####");
if(i==1) printf("....#");
if(i==2) printf("....#");
if(i==3) printf("#####");
if(i==4) printf("#....");
if(i==5) printf("#....");
if(i==6) printf("#####");
}
if(b[j]==3)
{
if(i==0) printf("#####");
if(i==1) printf("....#");
if(i==2) printf("....#");
if(i==3) printf("#####");
if(i==4) printf("....#");
if(i==5) printf("....#");
if(i==6) printf("#####");
}
if(b[j]==4)
{
if(i==0) printf("#...#");
if(i==1) printf("#...#");
if(i==2) printf("#...#");
if(i==3) printf("#####");
if(i==4) printf("....#");
if(i==5) printf("....#");
if(i==6) printf("....#");
}
if(b[j]==5)
{
if(i==0) printf("#####");
if(i==1) printf("#....");
if(i==2) printf("#....");
if(i==3) printf("#####");
if(i==4) printf("....#");
if(i==5) printf("....#");
if(i==6) printf("#####");
}
if(b[j]==6)
{
if(i==0) printf("#####");
if(i==1) printf("#....");
if(i==2) printf("#....");
if(i==3) printf("#####");
if(i==4) printf("#...#");
if(i==5) printf("#...#");
if(i==6) printf("#####");
}
if(b[j]==7)
{
if(i==0) printf("#####");
if(i==1) printf("....#");
if(i==2) printf("....#");
if(i==3) printf("....#");
if(i==4) printf("....#");
if(i==5) printf("....#");
if(i==6) printf("....#");
}
if(b[j]==8)
{
if(i==0) printf("#####");
if(i==1) printf("#...#");
if(i==2) printf("#...#");
if(i==3) printf("#####");
if(i==4) printf("#...#");
if(i==5) printf("#...#");
if(i==6) printf("#####");
}
if(b[j]==9)
{
if(i==0) printf("#####");
if(i==1) printf("#...#");
if(i==2) printf("#...#");
if(i==3) printf("#####");
if(i==4) printf("....#");
if(i==5) printf("....#");
if(i==6) printf("#####");
}
if(b[j]==10)
{
if(i==0) printf(".....");
if(i==1) printf("..#..");
if(i==2) printf("..#..");
if(i==3) printf("#####");
if(i==4) printf("..#..");
if(i==5) printf("..#..");
if(i==6) printf(".....");
}
if(b[j]==11)
{
if(i==0) printf(".....");
if(i==1) printf(".....");
if(i==2) printf(".....");
if(i==3) printf("#####");
if(i==4) printf(".....");
if(i==5) printf(".....");
if(i==6) printf(".....");
}
if(b[j]==12)
{
if(i==0) printf(".....");
if(i==1) printf(".....");
if(i==2) printf("#####");
if(i==3) printf(".....");
if(i==4) printf("#####");
if(i==5) printf(".....");
if(i==6) printf(".....");
}
}
printf("\n");
}
if(t) printf("\n");
}
}
或者是下面的代码
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
struct node
{
string s[10];//用结构体有结构体的好处,主要是能把数字存下来
} a[15];//用结构体更清晰,不想用字符串和结构体的也可以开三维的char数组。
//每一个a[i]代表i这个数字,10代表'+',11代表'-',12代表'=';
void init()
{
a[0].s[1]="#####";
a[0].s[2]="#...#";
a[0].s[3]="#...#";
a[0].s[4]="#...#";
a[0].s[5]="#...#";
a[0].s[6]="#...#";
a[0].s[7]="#####";
a[1].s[1]="....#";
a[1].s[2]="....#";
a[1].s[3]="....#";
a[1].s[4]="....#";
a[1].s[5]="....#";
a[1].s[6]="....#";
a[1].s[7]="....#";
a[2].s[1]="#####";
a[2].s[2]="....#";
a[2].s[3]="....#";
a[2].s[4]="#####";
a[2].s[5]="#....";
a[2].s[6]="#....";
a[2].s[7]="#####";
a[3].s[1]="#####";
a[3].s[2]="....#";
a[3].s[3]="....#";
a[3].s[4]="#####";
a[3].s[5]="....#";
a[3].s[6]="....#";
a[3].s[7]="#####";
a[4].s[1]="#...#";
a[4].s[2]="#...#";
a[4].s[3]="#...#";
a[4].s[4]="#####";
a[4].s[5]="....#";
a[4].s[6]="....#";
a[4].s[7]="....#";
a[5].s[1]="#####";
a[5].s[2]="#....";
a[5].s[3]="#....";
a[5].s[4]="#####";
a[5].s[5]="....#";
a[5].s[6]="....#";
a[5].s[7]="#####";
a[6].s[1]="#####";
a[6].s[2]="#....";
a[6].s[3]="#....";
a[6].s[4]="#####";
a[6].s[5]="#...#";
a[6].s[6]="#...#";
a[6].s[7]="#####";
a[7].s[1]="#####";
a[7].s[2]="....#";
a[7].s[3]="....#";
a[7].s[4]="....#";
a[7].s[5]="....#";
a[7].s[6]="....#";
a[7].s[7]="....#";
a[8].s[1]="#####";
a[8].s[2]="#...#";
a[8].s[3]="#...#";
a[8].s[4]="#####";
a[8].s[5]="#...#";
a[8].s[6]="#...#";
a[8].s[7]="#####";
a[9].s[1]="#####";
a[9].s[2]="#...#";
a[9].s[3]="#...#";
a[9].s[4]="#####";
a[9].s[5]="....#";
a[9].s[6]="....#";
a[9].s[7]="#####";
a[10].s[1]=".....";
a[10].s[2]="..#..";
a[10].s[3]="..#..";
a[10].s[4]="#####";
a[10].s[5]="..#..";
a[10].s[6]="..#..";
a[10].s[7]=".....";
a[11].s[1]=".....";
a[11].s[2]=".....";
a[11].s[3]=".....";
a[11].s[4]="#####";
a[11].s[5]=".....";
a[11].s[6]=".....";
a[11].s[7]=".....";
a[12].s[1]=".....";
a[12].s[2]=".....";
a[12].s[3]="#####";
a[12].s[4]=".....";
a[12].s[5]="#####";
a[12].s[6]=".....";
a[12].s[7]=".....";
}
int b[300],lb;
void fenjie(int Q)//把数字分解,然后存进b数组中
{
if(Q<0) Q=-Q;//去掉符号
int k[15];
int lk=0;
if(Q==0) k[lk++]=0;//如果数字为0要存入0。
while(Q)//倒叙
{
k[lk++]=Q%10;
Q/=10;
}
for(int i=lk-1; i>=0; i--)
b[lb++]=k[i];//再到着存入b中
return ;
}
int main()
{
init();// 10表示'+',11表示'-',12表示'=';
int t;
scanf("%d",&t);
while(t--)
{
int x,y,z;
scanf("%d%d",&x,&y);
z=x+y;
lb=0;
if(x<0) b[lb++]=11;//控制x的符号
fenjie(x);
if(y<0) b[lb++]=11;//控制y的符号,不是负号就是正号。
else b[lb++]=10;
fenjie(y);
b[lb++]=12;//输出等号
if(z<0) b[lb++]=11;//控制z的符号
fenjie(z);
//b数组中存输出顺序
for(int i=1; i<=7; i++)//输出第一行到第七行
{
for(int j=0; j<lb; j++)//每一行按数组b的顺序输出
{
if(j) cout<<".";//中间用'.'隔开
cout<<a[b[j]].s[i];//用字符串或者char数组输出都行
}
printf("\n");
}
if(t) printf("\n");//控制格式
}
}
I题:快速幂的变形
并不是所有问题都是盲目套模板的。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define LL long long
#define mod 10000000000
using namespace std;
//举个栗子:(a)6541341165*(b)9846541356
//将b拆开拆成,9,8,4,6,5,4,1,2,5,6
//然后把a*b变成:a*6+a*10%mod*5+a*10%mod*10%mod*2+a*10%mod*10%mod*10%mod*1+.....以此类推
//这样就能解决a*b会爆LL的问题了。
LL chengfa(LL a,LL b)
{
LL sum=0;
while(b)
{
sum=(sum+a*(b%10))%mod;
a=a*10%mod;
b=b/10;
}
return sum;
}
//LL chengfa(LL a,LL b)//如果mod为1e18的话就必须这样写了,用二进制解决这个问题
//{
// LL sum=0;
// while(b)
// {
// if(b%2==1) sum=(sum+a)%mod;
// a=(a+a)%mod;
// b=b/2;
// }
// return sum;
//}//看懂后你会发现这个代码和快速幂的代码基本上一样。*和+的区别。
LL pow(LL a,LL b)
{
LL sum=1;
while(b)
{
if(b%2==1) sum=chengfa(sum,a);
a=chengfa(a,a);
//这里的a是一个小于mod的数字,a可能是一个十位数的数字
//两个十位数相乘是二十位的数字,那么就超过了LL
//所以要想办法使得a*a不超过LL,具体看chengfa()函数。
b=b/2;
}
return sum;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%010lld\n",pow((LL)a,(LL)b));
}
return 0;
}
CTX学长的找位置游戏
这个问题叫做错排问题,
错排公式是f[n]=(n-1)*(f[n-1]+f[n-2]);
题上给出了第1,2,3,5,6项的值,需要你手推第四项,然后找规律。
#include<cstdio>
int a[100100];
int main()
{
a[1]=0;
a[2]=1;
a[3]=2;
for(int i=4;i<=100000;i++)
a[i]=(i-1)*(a[i-1]+a[i-2])%10007;
int t,x;
scanf("%d",&t);
while(t--)
{
scanf("%d",&x);
printf("%d\n",a[x]);
}
}