基本编程知识
当一个表达式对一个数取余的时候大概率存在周期,一般在三倍取模的数之内
(a+b)%c=(a%c+b%c)%c
(ab)%c=((a%c)(b%c))%c
ab%c=(a%c)b%c
例题
排序
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[15];//定义成long long用sort会出现问题
while(scanf("%d",&a[0])!=EOF)
{
for(int i=1; i<10; i++)
scanf("%d",&a[i]);
sort(a,a+10);
for(int i=0; i<9; i++)
printf("%d ",a[i]);
printf("%d\n",a[9]);
}
return 0;
}
枫之舞–排序
#include <bits/stdc++.h>
using namespace std;
int x[1005];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=0;i<n;i++)
scanf("%d",&x[i]);
sort(x,x+n,less<int>());
for(int i=0;i<n-1;i++)
printf("%d ",x[i]);
printf("%d",x[n-1]);
printf("\n");
}
return 0;
}
让气球飞吧
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char b[6][10]= {"red","green","blue","pink","black","orange"};
int n;
while(scanf("%d",&n)!=EOF)
{
int res[6]= {0};
int k;
for(k=0; k<n; k++)
{
char a[10];
scanf("%s",a);
int i;
for(i=0; i<6; i++)
{
if(strcmp(b[i],a)==0)
res[i]++;
}
}
int num=0,max=res[0];
int j;
for(j=1; j<6; j++)
{
if(max<res[j])
{
max=res[j];
num=j;
}
}
printf("%s\n",b[num]);
}
return 0;
}
数字序列
#include <bits/stdc++.h>
using namespace std;
int res[1000];
int main()
{
res[1]=res[2]=1;
int a,b,n;
while(cin>>a>>b>>n)
{
if(a==0&&b==0&&n==0)
break;
if(n==1||n==2)
cout<<res[n]<<endl;
else
{
int i;
for(i=3;i<1000;i++)//自动找循环节
{
res[i]=(a*res[i-1]+b*res[i-2])%7;
if(res[i]==1&&res[i-1]==1)//只将一个循环节存入数组
break;
}
n=n%(i-2);//注意循环节的下标,输出会造成些问题
if(n==0)
cout<<res[i-2]<<endl;
else
cout<<res[n]<<endl;
}
}
return 0;
}
昨日重现
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long int n;
while(cin>>n)
{
long long int n1=n,n2=n+1,n3=2*n+1;
long long int res;
//运用公式F(n)=(1/6*n*(n+1)*(2n+1))%1007
//对1/6的处理,拆成1/2*1/3,由题意一定能整除
if(n1%2==0)
n1=n1/2;
else
n2=n2/2;
if(n1%3==0)
n1=n1/3;
else if(n2%3==0)
n2=n2/3;
else
n3=n3/3;
res=((((n1%1007)*(n2%1007))%1007)*(n3%1007))%1007;//疯狂取模避免溢出
cout<<res<<endl;
}
return 0;
}
n!末尾有多少个0
观察个位数的乘法,仅有25能出现0
因此把n!进行因式分解一对25末尾就有一个0
而n!中2的数量一定大于5的数量
因此即统计n!因式分解后出现几个5即可
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long int n;
while(cin>>n)
{
int res=0;
while(n)
{
n=n/5;
res=res+n;
}
cout<<res<<endl;
}
return 0;
}
Google is Feeling Lucky
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
int n=1;
while(t--)
{
char ch[12][120];
int num[12];
for(int i=1; i<=10; i++)
cin>>ch[i]>>num[i];
int maxn=-999999;
for(int i=1; i<=10; i++)
{
if(num[i]>maxn)
maxn=num[i];
}
printf("Case #%d:\n",n);
n++;
for(int i=1; i<=10; i++)
if(num[i]==maxn)
cout<<ch[i]<<endl;
}
return 0;
}