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;
}