十道题题解

P1143
进制转换

#include<stdio.h>     思路就是转成十进制在转成给出的进制
#include<string.h>
int main()
{
	int a,c,sum=0,n=0;
	char b[1110];       因为给出的数值最大时,对应2进制的1106scanf("%d%s%d",&a,b,&c);
	for(int i=0;i<strlen(b);++i)
	{
		if('A'<=b[i]){sum=sum*a+b[i]-'A'+10;}
		else
		{
			sum=sum*a+b[i]-'0';
		}
	}
    for(int i=0;sum>0;++i)
    {
    	if(sum%c>9){b[i]='A'+sum%c-10;}
    	else
    	{
    		b[i]='0'+sum%c;
		}
		n++;
		sum/=c;
	}
	for(int i=n-1;i>=0;--i)
	{
		printf("%c",b[i]);
	}

P1469
找筷子

#include<stdio.h>  本弱鸡原来的方法是排序后找落单的
int main()         但看完大佬的题解后就不好意思放自己了
{
	int n,sum=0,d;
	scanf("%d",&n);
	for(int i=0;i<n;++i)
	{
		scanf("%d",&d);
		sum^=d;
	}
	printf("%d",sum);
 } 

P1100
高低位交换

#include<stdio.h>  挺憨的一道题,就是第1~16位放到第17~32位,
int main()
{
	unsigned int n,sum=0;
	int ch[33]={0};
	scanf("%u",&n);
	for(int i=0;n>0;++i)
	{
		ch[(i+16)%32]=n%2;    直接i+1632取模即可互换
		n/=2;
	}
	for(int i=31;i>=0;--i)
	{
		sum=sum*2+ch[i];
	}
	printf("%u",sum);
 } 

P1866 编号

#include<stdio.h>     排序,然后因为m[i]前的每一个都要一个编号,所以
#include<stdlib.h>    i就只剩m[i]-i种选择乘上sum即可
int cmp(const void* a,const void* b) 
{
	return (*(int*)a-*(int*)b);
}
int main()
{
	int n,m[51];
	long long int sum=1;
	scanf("%d",&n);
	for(int i=0;i<n;++i)
	{
		scanf("%d",&m[i]);
	}
	qsort(m,n,sizeof(int),cmp);
	for(int i=0;i<n;++i) 因为qsort的快排用在这挺合适的,所以我就不手搓了
	{
		sum=sum*(m[i]-i)%1000000007;
	} 上面这个是真的坑我一开始是最后取模的,以为不会炸,结果无限wa
	printf("%lld",sum);
 } 

P2822 组合数问题

#include <iostream> 这题就不可能会写,讲道理组合数早就忘光了,看题解
#include <cstdio>    也还差一个点没研究透,就是矩阵和。我太菜了*无限
#include <cstring>  
using namespace std;
int t,k,n,m;
int c[2005][2005],s[2005][2005];
void prepare();
int main(){
//    freopen("problem.in","r",stdin);
//    freopen("problem.out","w",stdout);
    memset(c,0,sizeof(c));
    memset(s,0,sizeof(s));
    cin>>t>>k;
    prepare();
    while(t--){
        cin>>n>>m;
        if(m>n) m=n;
        cout<<s[n][m]<<endl;
    }    
    return 0;
} 
void prepare(){
    c[1][1]=1;
    for(int i=0;i<=2000;i++) c[i][0]=1;
    for(int i=2;i<=2000;i++){
        for(int j=1;j<=i;j++){
            c[i][j]=(c[i-1][j]+c[i-1][j-1])%k;
        }
    }
    for(int i=2;i<=2000;i++){
        for(int j=1;j<=i;j++){
            s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
            if(c[i][j]==0) s[i][j]+=1;
        }
        s[i][i+1]=s[i][i];
    }
}

P2789 直线交点数

#include<stdio.h>  同样看了题解,因为不知道如何处理输出不平行的线的所有
int ch[100000]={0};  点数(没想到递归),从而暴毙
int max=0;
int Max(int a,int b)
{
	if(a>b)return a;
	return b;
}
int rule(int x,int k)
{
	if(x==0)
	{
		ch[k]=1;
		max=Max(max,k);
	}
	else for(int i=x;i>=1;--i)rule(x-i,i*(x-i)+k);
}
int main()
{
	int n,sum;
	scanf("%d",&n);
	rule(n,0);
	for(int i=0;i<=max;++i)
	{
		sum+=ch[i];
	}
	printf("%d",sum);
 } 

P1017 负进制转换

#include<stdio.h>  上网查了一下负进制,余数为负就-进制数,商加1
#include<math.h>    然后这题就很友好了
int main()
{
	int n,a,k=0,x,y;
	scanf("%d%d",&n,&a);
	char b[40];
	y=n;
	while(abs(n)>0)
	{
		x=n%a;
		n=n/a;
		if(x<0)
		{
			x=x-a;
			n++;
		}
		if(x>9){b[k]='A'+x-10;}
		else{
			b[k]=x+'0';
		}	
		++k;
	}
	printf("%d=",y);
	for(int i=k-1;i>=0;--i)
	{
		printf("%c",b[i]);
	}
	printf("(base%d)",a);
 } 

P3913 车的攻击

#include<stdio.h>  不难,很容易找到算法,就是LL和int相乘的进制转换让我头疼
#include<stdlib.h>
#define M 1000001
int l[M],r[M];
int cmp(const void*a,const void*b)
{
	return (*(int*)a-*(int*)b);
}
int main()
{   int x=0,y=0;
    l[0]=-22;
    r[0]=-22;
	long long int n,k;
	scanf("%lld%lld",&n,&k);
	for(int i=1;i<=k;++i)
	{
		scanf("%d%d",&l[i],&r[i]);
	}
	qsort(l,k+1,sizeof(int),cmp);
	qsort(r,k+1,sizeof(int),cmp);
	for(int i=1;i<=k;++i)
	{
		if(l[i]!=l[i-1])x++;if(r[i]!=r[i-1])y++;
	}
	long long int sum=((long long int)(x+y))*n-(long long int)x*y;
	printf("%lld",sum); 所以说为啥(x+y)和后面的-x*y一定要手动转LL啊,它不会自动转的吗,n已经是ll了呀,求学长让本菜鸡死个明白
 } 

P3383 【模板】线性筛素数

#include<stdio.h>           欧拉筛选 
#define M 100000001  任一合数只被:“最小质因数 × 最大因数(非自己) = 这个合数” 
#define N 10000001  一开始用的类似区间素数的做法,超时了,重复计算太多次了
int ss[N];
int ch[M]={0};
int prime(int x)
{
	int q=0;
	for(int i=2;i<=x;++i)
	{
		if(ch[i]==0)
		{
			ss[++q]=i;
		}
		for(int k=1;k<=q&&i*ss[k]<=x;++k)
		{
			ch[i*ss[k]]=1;
			if(i%ss[k]==0)break;
		}
	}
}
int main()
{
	int m,n,d;
	scanf("%d%d",&m,&n);
	prime(m);
	for(int i=1;i<=n;++i)
	{
		scanf("%d",&d);
		printf("%d\n",ss[d]);
	}
 } 

P1403 [AHOI2005]约数研究

#include<stdio.h>  //很傻的一道题,但AC后看题解发现,我真的菜
#include<stdbool.h>
#define M 1000001
//bool a[M]=;
int sum=0;
int kk(int x)
{
	for(int i=1;i<=x;++i)
	{
		for(int k=i;k<=x;k+=i)sum++;
	}
}
int main()
{
	int n;
	scanf("%d",&n);
	kk(n);
	printf("%d",sum);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值