http://codeforces.com/contest/869
1 给定两个数组,问你是否存在a[i]^b[j] 存在与a或b数组中。
规定,这2*n个数字都是不同的
统计符合条件的 数对 为奇数还是偶数。。
模拟。。
或者,ai xor bj = ak,那么ak xor bj = ai。
所以一定是偶数。。。
还wa了一次,两个数异或,是可能大于这两个数的max的。。
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e3+200;
int a[maxn];
int b[maxn];
const int maxm=2e8+100;
bool vis[maxm];
int main()
{ int m;
while(~scanf("%d",&m)){
memset(vis,false,sizeof(vis));
for(int i=1;i<=m;i++)
scanf("%d",&a[i]),vis[a[i]]=true;
for(int i=1;i<=m;i++)
scanf("%d",&b[i]),vis[b[i]]=true;
int sum=0;
for(int i=1;i<=m;i++){
for(int j=1;j<=m;j++){
if(vis[a[i]^b[j]])
sum++;
}
}
if(sum%2){
puts("Koyomi");
}
else
puts("Karen");
}
return 0;
}
2 给定a,b
输出a!/b!的最后一位。。
用的那个最后一位的规律写的,比较麻烦。
后来发现,如果存在0,一定是0.。
否则的话,最多算十次。。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll sum;
ll a,b;
ll num[10];
ll num2[10];
int tim[11][8]={
{
0
},
{1},
{6,2,4,8},
{1,3,9,7},
{
6,4
},
{5
},
{ 1,6,9,3
},
{
1,7,9,3
},
{ 6,8,4,2
},
{ 1,9
},
};
int v[11];
int main()
{ while(~scanf("%lld%lld",&a,&b)){
memset(num,0,sizeof(num));
memset(num2,0,sizeof(num2));
ll t=a/10;
v[2]=4;
v[3]=4;
v[4]=2;
v[7]=4;
v[8]=4;
v[9]=2;
for(int i=0;i<=9;i++){
num[i]=t;
}
//cout<<t<<endl;
ll ss=a%10;
for(int i=0;i<=ss;i++){
num[i]++;
//cout<<i<<endl;
}
t=b/10;
for(int i=0;i<=9;i++){
num2[i]=t;
}
ss=b%10;
for(int i=0;i<=ss;i++){
num2[i]++;
}
int sum=1;
for(int i=0;i<=9;i++){
ll ttt=num2[i]-num[i];
if(ttt>0){
if(i==0||i==1||i==5||i==6)
sum*=i;
else
sum*=tim[i][ttt%v[i]];
}
}
sum=sum%10;
printf("%d\n",sum);
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
/* 直接模拟就行。注意有10,一定是0
*/
typedef long long ll;
int main()
{ ll a,b;
while(~scanf("%lld%lld",&a,&b)){
ll ans=1;
bool flag=false;
for(ll l=a+1;l<=b&&!flag;l++){
if(l%10==0) flag=true;
else
ans*=l;
ans%=10;
}
if(flag)
puts("0");
else
printf("%d\n",ans);
}
return 0;
}