P1143
进制转换
#include<stdio.h> 思路就是转成十进制在转成给出的进制
#include<string.h>
int main()
{
int a,c,sum=0,n=0;
char b[1110]; 因为给出的数值最大时,对应2进制的1106位
scanf("%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+16和32取模即可互换
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);
}