A
D
#include<cstdio>
using namespace std;
const int N=5000;
int a[N],b[N],c[N];
int n,na,nb,nc;
int min(int a,int b)
{
if(a<b)
return a;
return b;
}
int main()
{
int i,d,ans;
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
na=0;nb=0;nc=0;
for(i=1;i<=n;i++)
{
scanf("%d",&d);
if(d==1)
a[na++]=i;
else if(d==2)
b[nb++]=i;
else if(d==3)
c[nc++]=i;
}
ans=min(na,min(nb,nc));
printf("%d\n",ans);
for(i=0;i<ans;i++)
printf("%d %d %d\n",a[i],b[i],c[i]);
}
return 0;
}
B
建立前向表和后向表,n为偶数是正序填写第1,3,5....位数,逆序填写第n-2,n-4...0位数,n为奇数时正序填写第1,3,5....位数,然后找到位于0为的同学编号依次填写0,2,4...位数。
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1000005;
int fir[N],las[N],f,l,n;
int ans[200005],p[N];
int main()
{
int a,b,i,fl;
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
memset(fir,-1,sizeof(fir));
memset(las,-1,sizeof(las));
memset(p,-1,sizeof(p));
for(i=0;i<n;i++)
{
scanf("%d%d",&a,&b);
p[a]=1;
p[b]=1;
fir[a]=b;
las[b]=a;
if(a==0)
f=b;
if(b==0)
l=a;
}
if(n%2==0)
{
//printf("f=%d l=%d\n",f,l);
for(i=1;i<n;i+=2)
{
ans[i]=f;
f=fir[f];
}
for(i=n-2;i>=0;i-=2)
{
ans[i]=l;
l=las[l];
}
for(i=0;i<n;i++)
{
if(i==0)
printf("%d",ans[i]);
else
printf(" %d",ans[i]);
}
printf("\n");
}
else if(n%2==1)
{
for(i=1;i<n;i+=2)
{
ans[i]=f;
p[f]=-1;
f=fir[f];
}
for(i=1;i<N;i++)
if(p[i]!=-1)
{
l=i;
break;
}
while(las[l]!=-1)
l=las[l];
for(i=0;i<n;i+=2)
{
ans[i]=l;
l=fir[l];
}
for(i=0;i<n;i++)
{
if(i==0)
printf("%d",ans[i]);
else
printf(" %d",ans[i]);
}
printf("\n");
}
}
return 0;
}
c
ma表示正向前i位数组成的数mod a 后的余数
mp表示1,10,100,1000,10000......mod b后的余数
mb表示倒数i位数字mod b 后的余数
mb[i]=mb[i+1]+(s[i]-'0')*10^x x为从第i位到最后一位字符组成的数的位数
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1000005;
char s[N];
int a,b,len;
int ma[N],mb[N],mp[N];
void init()
{
int i,p=1;
for(i=0;i<len;i++)
{
p=p%b;
mp[i]=p;
p*=10;
}
p=0;
for(i=0;i<len;i++)
{
p=p*10+s[i]-'0';
p=p%a;
ma[i]=p;
}
p=0;
for(i=len-1;i>=0;i--)
{
p=(s[i]-'0')*mp[len-i-1]+p;
p=p%b;
mb[i]=p;
}
}
int main()
{
int i,j;
//freopen("in.txt","r",stdin);
while(scanf("%s",s)!=EOF)
{
len=strlen(s);
scanf("%d%d",&a,&b);
init();
//for(i=0;i<len;i++) printf("%d ",ma[i]);printf("\n");
//for(i=0;i<len;i++) printf("%d ",mp[i]);printf("\n");
//for(i=0;i<len;i++) printf("%d ",mb[i]);printf("\n");
for(i=1;i<len;i++)
if(ma[i-1]==0&&mb[i]==0)
break;
while(s[i]=='0')
i++;
if(i==len)
{
printf("NO\n");
}
else
{
printf("YES\n");
//printf("i=%d\n",i);
for(j=0;j<i;j++)
printf("%c",s[j]);
printf("\n");
for(j=i;j<len;j++)
printf("%c",s[j]);
printf("\n");
}
}
return 0;
}
D
输入a,b,c,d;
统计第一组数和第二组数的因子中有多少2,3
除2,转换成2的因子数减一
乘2/3转换成3的因子减一,2的因子数加一
#include<cstdio>
using namespace std;
int abs(int a)
{
if(a>0)
return a;
return -a;
}
int main()
{
int a,b,c,d,d1,d2,d3,d4,t1,t2,ans;
long long ra,rb;
//freopen("in.txt","r",stdin);
while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF)
{
ra=(long long)a*(long long)b;
rb=(long long)c*(long long)d;
d1=d2=d3=d4=0;
while(ra%2==0)
{
d1++;
ra/=2;
}
while(ra%3==0)
{
d2++;
ra/=3;
}
while(rb%2==0)
{
d3++;
rb/=2;
}
while(rb%3==0)
{
d4++;
rb/=3;
}
if(ra!=rb)
{
printf("-1\n");
continue;
}
ans=abs(d2-d4);
ans+=abs(d1+(d2-d4)-d3);
printf("%d\n",ans);
t1=abs(d2-d4);
if(d2>d4)
{
d1+=t1;
while(t1!=0&&a%3==0)
{
a=a/3*2;
t1--;
}
if(t1>0)
{
while(t1 !=0&&b%3==0)
{
t1--;
b=b/3*2;
}
}
}
else if(d4>d2)
{
d3+=t1;
while(t1!=0&&c%3==0)
{
c=c/3*2;
t1--;
}
if(t1>0)
{
while(t1!=0&&d%3==0)
{
t1--;
d=d/3*2;
}
}
}
if(d1>d3)
{
t2=d1-d3;
while(t2!=0&&a%2==0)
{
a/=2;
t2--;
}
if(t2>0)
{
while(t2!=0&&b%2==0)
{
t2--;
b/=2;
}
}
}
else if(d3>d1)
{
t2=d3-d1;
while(t2!=0&&c%2==0)
{
c/=2;
t2--;
}
if(t2>0)
{
while(t2!=0&&d%2==0)
{
t2--;
d/=2;
}
}
}
printf("%d %d\n",a,b);
printf("%d %d\n",c,d);
}
return 0;
}