20190726

T1SuperGcd:

题目描述

Sheng bill有着惊人的心算能力,甚至能用大脑计算出两个巨大的数的GCD(最大公约 数)!因此他经常和别人比赛计算GCD。有一天Sheng bill很嚣张地找到了你,并要求和你比 赛,但是输给Sheng bill岂不是很丢脸!所以你决定写一个程序来教训他。

输入格式

共两行: 第一行:一个数A。 第二行:一个数B。

输出格式

一行,表示A和B的最大公约数。

输入输出样例

输入 #1复制

12
54

输出 #1复制

6

说明/提示

对于20%的数据,0 < A , B ≤ 10 ^ 18。 对于100%的数据,0 < A , B ≤ 10 ^ 10000。

2018-06-08 xenonex提供一组hack的数据

#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cstdio>
using namespace std;

const int base = 1e9;
const int N = 1e4 + 10;

struct Int {
    int len, n[N / 9 + 10];
    Int() {}
    Int(char * s) {
        int x = strlen(s);
        len = x / 9 + (x % 9 ? 1 : 0);
        int p = x - 1;
        for(int i = 1; i <= len; i ++) {
            n[i] = 0;
            for(int j = min(p, 8); j >= 0; j --)
                n[i] = n[i] * 10 + (s[p - j] & 15);
            p -= 9;
        }
    }
    bool zero() { return len == 1 && n[1] == 0; }
    bool judge() { return !zero() && 0 == (n[1] & 1); }
    bool operator < (const Int &b) const {
        if(len != b.len) return len < b.len;
        for(int i = len; i >= 1; i --)
            if(n[i] != b.n[i]) return n[i] < b.n[i];
        return 0;
    }
    bool operator -= (const Int &b) {
        for(int i = 1; i <= len; i ++) {
            if(i <= b.len) {
                n[i] -= b.n[i];
                if(n[i] < 0) n[i + 1] --, n[i] += base;
            }
        }
        for(; !n[len] && len > 1; len --);
        return zero();
    }
    void div2() {
        for(int i = 1; i <= len; i ++) {
            if(n[i] & 1) n[i - 1] += base >> 1;
            n[i] >>= 1;
        }
        for(; !n[len] && len > 1; len --);
    }
    void operator <<= (const int &x) {
        for(int t = 1; t <= x; t ++) {
            n[len + 1] = 0;
            for(int i = len; i >= 1; i --) {
                n[i] <<= 1; n[i + 1] += n[i] / base; n[i] %= base;
            }
            if(n[len + 1]) len ++;
        }
        this -> print();
    }
    void print() {
        for(int i = len; i >= 1; i --)
            if(i == len) printf("%d", n[i]);
            else printf("%09d", n[i]);
        printf("\n");
    }
} x, y;

int main() {
    static char A[N], B[N];
    scanf("%s %s", A, B);
    x = Int(A), y = Int(B);
    if(x.zero()) return y.print(), 0;
    if(y.zero()) return x.print(), 0;
    int i = 0, j = 0;
    for(; x.judge(); i ++) x.div2();
    for(; y.judge(); j ++) y.div2();
    while(1) {
        if(!(x < y)) {
            if(x -= y) return y <<= min(i, j), 0;
            while(x.judge()) x.div2();
        } else {
            if(y -= x) return x <<= min(i, j), 0;
            while(y.judge()) y.div2();
        }
    }
    return 0;
}

T2又是毕业季2:

#include <iostream>
#include <cstdio>
using namespace std;
int cnt[1000005],ans[10005];
void solve(int x)
{
    for (int i=1;i*i<=x;i++)
        if (x%i==0)
        {
            cnt[i]++;
            if (i*i!=x)
                cnt[x/i]++;
        }
}
int main()
{
    int n,maxa=0;
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        int a;
        scanf("%d",&a);
        solve(a);
        maxa=max(a,maxa);       
    }
    for (int i=maxa;i>=1;i--)
        if (ans[cnt[i]]==0)
            ans[cnt[i]]=i;
    int temp=0;
    for (int i=n;i>=1;i--)
    {
        ans[i]=max(temp,ans[i]);
        temp=max(temp,ans[i]);
    }
    for (int i=1;i<=n;i++)
        printf("%d\n",ans[i]);  
    return 0;
}

T3阶乘问题:

#include<iostream>
using namespace std;
int main()
{
    long long result=1;
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        result*=i;
        while(result%10==0)
            result/=10;
        result=result%100000000;
    }
    cout<<result%10;
}

T4计算系数:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int a,b,k,n,m;
long long f[1005][1005];
int main()
{
    scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
    f[0][0]=1;
    for (int i=0;i<=n;i++)
        for (int j=0;j<=m;j++)
        {
            if (i==0 && j==0) continue;
            f[i][j]=0;
            if (i>0)
                f[i][j]=(f[i][j]+f[i-1][j]*a)%10007;
            if (j>0)
                f[i][j]=(f[i][j]+f[i][j-1]*b)%10007;
        }
    printf("%lld\n",f[n][m]);
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值