马蹄集oj赛(第十次)

目录

2的N次幂

升级版斐波那契数列

个数统计

个数统计2

大斐列

A+B problem

​编辑

A-B problem

快速幂

进行一个幂的运算

整数大小比较


2的N次幂


难度:黄金
0时间限制:1秒
巴占用内存:128M
任意给定一个正整数N(N≤100),计算2的N次方的值。
格式
输入格式:输入一个正整数N。
输出格式:输出2的N次方的值。

//
// Created by abner on 2023/8/30.
//
#include <bits/stdc++.h>
const int LEN = 1e2;
int a[LEN]={1},b[LEN]={2},c[LEN],n;
void clear(int a[]){
    for(int i=0;i<LEN;i++)
    a[i]=0;
}
void read(int a[]){
    char s[LEN];
    scanf("%s",s);
    clear(a);
    int len = strlen(s);
    for (int i=0;i<len;i++)
        a[len-i-1]=s[i]-'0';
}
void print(int a[]) {
    int i;
    for (i = LEN - 1; i >= 1; i--)
        if (a[i] != 0)
            break;
    for (; i >= 0; i--)
        putchar(a[i] + '0');
    putchar('\n');
}
void add(int a[],int b[],int c[]) {//a+b=c
    clear(c);
    for (int i = 0; i < LEN - 1; i++) {
        c[i] += a[i] + b[i];
        if (c[i] >= 10) {
            c[i + 1] += 1;
            c[i] -= 10;
        }
    }
}
void mul(int a[],int b[],int c[]){//a*b=c
    clear(c);
    for (int i=0;i<LEN - 1;i++){
        for (int j=0;j<=i;j++)
            c[i]+=a[j]*b[i-j];
        if(c[i]>=10) {
            c[i + 1] += c[i] / 10;
            c[i] %= 10;
        }
    }
}
            int main(){
                scanf("%d",&n);
                while (n--){
                    mul(a,b,c);
                    memcpy(a,c,sizeof(c));
                }
                print(c);
                return 0;
}

升级版斐波那契数列


难度:黄金0时间限制:1秒
巴占用内存:128M
我们都知道斐波那契数列一项是前两项的和,现在我们规定一个升级版斐波那契数列,
一项为前三项的和,要求前n项的和。
即:定义F[1]=1,F[2]=1,F[3]=1,递推关系为F[N]=F[N-1]+F[N-2]+F[N-3]
格式
输入格式:第一行包含一个数n。
输出格式:前n项的和。

//
// Created by abner on 2023/8/30.
//
#include <bits/stdc++.h>
const int LEN = 1e4;
int a[LEN]={1},b[LEN]={1},c[LEN] = {1},d[LEN],ans[LEN]={3},temp[LEN],n;


void clear(int a[]){
    for(int i=0;i<LEN;i++)
    a[i]=0;
}
void read(int a[]){
    char s[LEN];
    scanf("%s",s);
    clear(a);
    int len = strlen(s);
    for (int i=0;i<len;i++)
        a[len-i-1]=s[i]-'0';
}
void print(int a[]) {
    int i;
    for (i = LEN - 1; i >= 1; i--)
        if (a[i] != 0)
            break;
    for (; i >= 0; i--)
        putchar(a[i] + '0');
    putchar('\n');
}
void add(int a[],int b[],int c[]) {//a+b=c
    clear(c);
    for (int i = 0; i < LEN - 1; i++) {
        c[i] += a[i] + b[i];
        if (c[i] >= 10) {
            c[i + 1] += 1;
            c[i] -= 10;
        }
    }
}
            int main(){
                scanf("%d",&n);
                for (int i=4;i <=n;i++){
                    add(a, b, temp);
                    add(temp,c,d);
                    memcpy(a,b,sizeof b);
                    memcpy(b,c,sizeof c);
                    memcpy(c,d,sizeof d);
                    memcpy(temp,ans,sizeof ans);
                    add(temp,d,ans);
                }
                print(ans);
                return 0;
}

个数统计


难度:黄金
0时间限制:1秒
巴占用内存:128M
给你一个非负整数N,请求出他的阶乘N!中某个数a出现的次数m。
例如:N=5,a=1时,5!=120,故m=1。
格式
输入格式:输入一行用空格隔开的两个非负整数,分别代表N和α。
输出格式:输出一行一个正整数代表m。

//
// Created by abner on 2023/8/30.
//
#include <bits/stdc++.h>
const int LEN = 1e4;
int a[LEN]{1},b[LEN]{1},n,a2,ans;


void clear(int a[]){
    for(int i=0;i<LEN;i++)
        a[i]=0;
}
void read(int a[]){
    char s[LEN];
    scanf("%s",s);
    clear(a);
    int len = strlen(s);
    for (int i=0;i<len;i++)
        a[len-i-1]=s[i]-'0';
}
void print(int a[]) {
    int i;
    for (i = LEN - 1; i >= 1; i--)
        if (a[i] != 0)
            break;
    for (; i >= 0; i--)
        putchar(a[i] + '0');
    putchar('\n');
}
void add(int a[],int b[],int c[]) {//a+b=c
    clear(c);
    for (int i = 0; i < LEN - 1; i++) {
        c[i] += a[i] + b[i];
        if (c[i] >= 10) {
            c[i + 1] += 1;
            c[i] -= 10;
        }
    }
}
void mul(int a[],int b[],int c[]){//a*b=c
    clear(c);
    for (int i=0;i<LEN - 1;i++){
        for (int j=0;j<=i;j++)
            c[i]+=a[j]*b[i-j];
        if(c[i]>=10) {
            c[i + 1] += c[i] / 10;
            c[i] %= 10;
        }
    }
}
void mul_short(int a[],int b,int c[]) {//a*b=c,高精度*单精度
    clear(c);
    for (int i = 0; i < LEN - 1; ++i) {
        c[i] += a[i] * b;
        if (c[i] >= 10) {
            c[i + 1] += c[i] / 10;
            c[i] %= 10;
        }
    }
}
int main(){
    scanf("%d%d",&n,&a2);
    for (int i=2;i<=n;i++){
        mul_short(a,i,b);
        memcpy(a,b,sizeof(b));
    }
    int tag;
    for (tag = LEN -1;tag >= 1;tag--)
    if (b[tag]!=0)
    break;
    for (;tag >=0;tag--)
        if (b[tag]==a2)
            ans++;
            printf("%d",ans);
    return 0;
}

个数统计2


难度:黄金
0时间限制:1秒
巴占用内存:128M
给你一个非负整数N,请求出它的阶乘N!中某个数b出现的次数m。
注意,判断时,不关注数字出现在哪一位,只关注数字是否一致。
例如:N=5,b=12时,5!=120,故m=1。
格式
输入格式:输入一行用空格隔开的两个非负整数,分别代表N和b
输出格式:输出一行一个正整数代表m。

//
// Created by abner on 2023/8/30.
//
#include <bits/stdc++.h>
const int LEN = 1e4;
int a[LEN]{1},b[LEN]{1},n,a2,ans;
char s[LEN];


void clear(int a[]){
    for(int i=0;i<LEN;i++)
        a[i]=0;
}
void read(int a[]){
    char s[LEN];
    scanf("%s",s);
    clear(a);
    int len = strlen(s);
    for (int i=0;i<len;i++)
        a[len-i-1]=s[i]-'0';
}
void print(int a[]) {
    int i;
    for (i = LEN - 1; i >= 1; i--)
        if (a[i] != 0)
            break;
    for (; i >= 0; i--)
        putchar(a[i] + '0');
    putchar('\n');
}
void add(int a[],int b[],int c[]) {//a+b=c
    clear(c);
    for (int i = 0; i < LEN - 1; i++) {
        c[i] += a[i] + b[i];
        if (c[i] >= 10) {
            c[i + 1] += 1;
            c[i] -= 10;
        }
    }
}
void mul(int a[],int b[],int c[]){//a*b=c
    clear(c);
    for (int i=0;i<LEN - 1;i++){
        for (int j=0;j<=i;j++)
            c[i]+=a[j]*b[i-j];
        if(c[i]>=10) {
            c[i + 1] += c[i] / 10;
            c[i] %= 10;
        }
    }
}
void mul_short(int a[],int b,int c[]) {//a*b=c,高精度*单精度
    clear(c);
    for (int i = 0; i < LEN - 1; ++i) {
        c[i] += a[i] * b;
        if (c[i] >= 10) {
            c[i + 1] += c[i] / 10;
            c[i] %= 10;
        }
    }
}
bool find(int x){
    int len(strlen(s));
    if (x < len -1)
    return false;
    for (int i=x,j=0;j<len;j++,i--){
        if(b[i]!=s[j]-'0')
            return false;
}
return true;
}
int main(){

    scanf("%d%s", &n, s);
    for (int i=2;i<=n;i++){
        mul_short(a,i,b);
        memcpy(a,b,sizeof(b));
    }
    int tag;
    for (tag = LEN -1;tag >= 1;tag--)
    if (b[tag]!=0)
    break;
    for (;tag >=0;tag--)
        if (find(tag))
            ans++;
            printf("%d",ans);
    return 0;
}

大斐列


难度:黄金
时间限制:1秒
巴占用内存:128M
计算斐波那契数列第n项。
斐波那契数列:1、1、2、3、5、8、13、21、34、
定义F[1]=1,F[2]=1,递推关系为F[N]=F[N-1]+F[N-2]
格式
输入格式:一个整数n。
输出格式:一个整数F[nl。


//
// Created by abner on 2023/8/30.
//
#include <bits/stdc++.h>
using namespace std;
const int LEN = 1e4;
int a[LEN]{1},b[LEN]{1},c[LEN],n;

void clear(int a[]){
    for(int i=0;i<LEN;i++)
        a[i]=0;
}
void read(int a[]){
    char s[LEN];
    scanf("%s",s);
    clear(a);
    int len = strlen(s);
    for (int i=0;i<len;i++)
        a[len-i-1]=s[i]-'0';
}
void print(int a[]) {
    int i;
    for (i = LEN - 1; i >= 1; i--)
        if (a[i] != 0)
            break;
    for (; i >= 0; i--)
        putchar(a[i] + '0');
    putchar('\n');
}
void add(int a[],int b[],int c[]) {//a+b=c
    clear(c);
    for (int i = 0; i < LEN - 1; i++) {
        c[i] += a[i] + b[i];
        if (c[i] >= 10) {
            c[i + 1] += 1;
            c[i] -= 10;
        }
    }
}
void mul(int a[],int b[],int c[]){//a*b=c
    clear(c);
    for (int i=0;i<LEN - 1;i++){
        for (int j=0;j<=i;j++)
            c[i]+=a[j]*b[i-j];
        if(c[i]>=10) {
            c[i + 1] += c[i] / 10;
            c[i] %= 10;
        }
    }
}
void mul_short(int a[],int b,int c[]) {//a*b=c,高精度*单精度
    clear(c);
    for (int i = 0; i < LEN - 1; ++i) {
        c[i] += a[i] * b;
        if (c[i] >= 10) {
            c[i + 1] += c[i] / 10;
            c[i] %= 10;
        }
    }
}
//bool find(int x){
//    int len(strlen(s));
//    if (x < len -1)
//        return false;
//    for (int i=x,j=0;j<len;j++,i--){
//        if(b[i]!=s[j]-'0')
//            return false;
//    }
//    return true;
//}
int main(){
    scanf("%d",&n);
    for (int i=3;i<=n;i++){
        add(a,b,c);
    memcpy(a,b,sizeof b);
    memcpy(b,c,sizeof c);
}
print(c);
return 0;
}

A+B problem


难度:黄金
0时间限制:1秒
巴占用内存:128M
计算A+B(1≤A,B≤1010000)。
格式
输入格式:两行每行一个整数A,B。
输出格式:一个整数A+B。
样例1
输入:1
1
输出:2

//
// Created by abner on 2023/8/30.
//
#include <bits/stdc++.h>
const int LEN = 10e4+7;
int a[LEN],b[LEN],c[LEN],n,a2,ans;
char s[LEN];


void clear(int a[]){
    for(int i=0;i<LEN;i++)
        a[i]=0;
}
void read(int a[]){
    char s[LEN];
    scanf("%s",s);
    clear(a);
    int len = strlen(s);
    for (int i=0;i<len;i++)
        a[len-i-1]=s[i]-'0';
}
void print(int a[]) {
    int i;
    for (i = LEN - 1; i >= 1; i--)
        if (a[i] != 0)
            break;
    for (; i >= 0; i--)
        putchar(a[i] + '0');
    putchar('\n');
}
void add(int a[],int b[],int c[]) {//a+b=c
    clear(c);
    for (int i = 0; i < LEN - 1; i++) {
        c[i] += a[i] + b[i];
        if (c[i] >= 10) {
            c[i + 1] += 1;
            c[i] -= 10;
        }
    }
}
void mul(int a[],int b[],int c[]){//a*b=c
    clear(c);
    for (int i=0;i<LEN - 1;i++){
        for (int j=0;j<=i;j++)
            c[i]+=a[j]*b[i-j];
        if(c[i]>=10) {
            c[i + 1] += c[i] / 10;
            c[i] %= 10;
        }
    }
}
void mul_short(int a[],int b,int c[]) {//a*b=c,高精度*单精度
    clear(c);
    for (int i = 0; i < LEN - 1; ++i) {
        c[i] += a[i] * b;
        if (c[i] >= 10) {
            c[i + 1] += c[i] / 10;
            c[i] %= 10;
        }
    }
}
bool find(int x){
    int len(strlen(s));
    if (x < len -1)
        return false;
    for (int i=x,j=0;j<len;j++,i--){
        if(b[i]!=s[j]-'0')
            return false;
    }
    return true;
}
int main() {
    read(a);
    read(b);
    add(a, b, c);
    print(c);
    return 0;
}

A-B problem


难度:黄金
0时间限制:1秒
巴占用内存:128M
计算A-B(1≤B≤A≤1010000)。
格式
输入格式:两行每行一个整数A,B。
输出格式:一个整数A一B。
样例1
输入:2
1

//
// Created by abner on 2023/8/30.
//
#include <bits/stdc++.h>
const int LEN = 10e4+7;
int a[LEN],b[LEN],c[LEN],n,a2,ans;
char s[LEN];


void clear(int a[]){
    for(int i=0;i<LEN;i++)
        a[i]=0;
}
void read(int a[]){
    char s[LEN];
    scanf("%s",s);
    clear(a);
    int len = strlen(s);
    for (int i=0;i<len;i++)
        a[len-i-1]=s[i]-'0';
}
void print(int a[]) {
    int i;
    for (i = LEN - 1; i >= 1; i--)
        if (a[i] != 0)
            break;
    for (; i >= 0; i--)
        putchar(a[i] + '0');
    putchar('\n');
}
void add(int a[],int b[],int c[]) {//a+b=c
    clear(c);
    for (int i = 0; i < LEN - 1; i++) {
        c[i] += a[i] + b[i];
        if (c[i] >= 10) {
            c[i + 1] += 1;
            c[i] -= 10;
        }
    }
}
void mul(int a[],int b[],int c[]){//a*b=c
    clear(c);
    for (int i=0;i<LEN - 1;i++){
        for (int j=0;j<=i;j++)
            c[i]+=a[j]*b[i-j];
        if(c[i]>=10) {
            c[i + 1] += c[i] / 10;
            c[i] %= 10;
        }
    }
}
void mul_short(int a[],int b,int c[]) {//a*b=c,高精度*单精度
    clear(c);
    for (int i = 0; i < LEN - 1; ++i) {
        c[i] += a[i] * b;
        if (c[i] >= 10) {
            c[i + 1] += c[i] / 10;
            c[i] %= 10;
        }
    }
}
bool find(int x){
    int len(strlen(s));
    if (x < len -1)
        return false;
    for (int i=x,j=0;j<len;j++,i--){
        if(b[i]!=s[j]-'0')
            return false;
    }
    return true;
}
void sub(int a[],int b[],int c[]){
    clear(c);
    for (int i=0;i<LEN - 1;i++){
        c[i]+=a[i]-b[i];
        if(c[i]<0){
            c[i+1]-=1;
            c[i]+=10;
        }
    }
}
int main() {
    read(a);
    read(b);
    sub(a, b, c);
    print(c);
    return 0;
}

快速幂


难度:黄金
0时间限制:1秒
巴占用内存:128M
给你三个整数a,b,c,让你求出a5 mod c。
格式
输入格式:三个用空格隔开的整数a,b和c。
输出格式:一个整数,表示a5 mod c的值。
样例1
输入:239
输出:8

//
// Created by abner on 2023/8/30.
//
#include <bits/stdc++.h>
using namespace std;
int a,b,c;
long long binpow(long long a,long long b,long long m){
    a%=m;
    long long res = 1;
    while (b > 0){
    if (b &1)
        res =res * a%m;
    a=a*a%m;
    b>>=1;
}
return res;
}
int main(){
    cin >>a >>b >>c;
    cout <<binpow(a,b,c);
    return 0;
}

进行一个幂的运算


难度:黄金
©时间限制:1秒
巴占用内存:128M
让我们来简单练习一下求幂。
给出m和k,求m的2k-1次幂。答案对100000007取模。
格式
输入格式:两个整数m,k,,意义如题所示。
输出格式:一个整数表示答案。

//
// Created by abner on 2023/8/30.
//
#include <bits/stdc++.h>
using namespace std;
const int mod = 100000007;
int m,k;
long long binpow(long long a,long long b,long long m){
    a %= m;
    long long res = 1;
    while (b > 0){
        res = res * a % m;
        a=a * a % m;
        b--;
    }
    return res;
}
int main(){
    cin >>m >>k;
    cout << binpow(m,k,mod);
    return 0;
}

整数大小比较


难度:黄金
0时间限制:1秒
巴占用内存:128M
给出两个正整数,判断他们的大小。
格式
输入格式:两个正整数。
输出格式:若前者大,输出>,
若后者大,输出
若一样大,输出=。
样例1
输入:141289461924461989123762842222

//
// Created by abner on 2023/8/30.
//
#include <bits/stdc++.h>
using namespace std;
int main(){
    string s1,s2;
    cin >>s1 >>s2;
    if (s1.length()>s2.length())
        cout <<">"<<endl;
    else if (s1.length()<s2.length())
        cout <<"<"<<endl;
    else{
        if(s1>s2)
    cout <<">"<<endl;
    else if (s1 < s2)
        cout <<"<"<<endl;
    else
        cout <<"="<<endl;
}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值