【数论】数论专题练习

今天下午开始被逼去搞数论了╮(╯▽╰)╭
1.Codevs1087麦森数
题目描述 Description

形如2P-1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数,2P-1不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377,它有909526位。麦森数有许多重要应用,它与完全数密切相关。

任务:从文件中输入P1000<P<3100000),计算2P-1的位数和最后500位数字(用十进制高精度数表示)

输入描述 Input Description

文件中只包含一个整数P1000<P<3100000

输出描述 Output Description

第一行:十进制高精度数2P-1的位数。

2-11行:十进制高精度数2P-1的最后500位数字。(每行输出50位,共输出10行,不足500位时高位补0

不必验证2P-1P是否为素数。

样例输入 Sample Input

1279

样例输出 Sample Output

386

00000000000000000000000000000000000000000000000000

00000000000000000000000000000000000000000000000000

00000000000000104079321946643990819252403273640855

38615262247266704805319112350403608059673360298012

23944173232418484242161395428100779138356624832346

49081399066056773207629241295093892203457731833496

61583550472959420547689811211693677147548478866962

50138443826029173234888531116082853841658502825560

46662248318909188018470682222031405210266984354887

32958028878050869736186900714720710555703168729087

很明显一看到巨大的次方数就想到了快速幂和高精乘0-0结果总是写残总是写残(╯‵□′)╯︵┻━┻改了好久才改好了╮(╯▽╰)╭
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;int f[30001];
int num;
int find(int x)
{ 
if (f[x]!=x) 
f[x]=find(f[x]);
return f[x];
}
void union_set(int a,int b)
{ 
int t1,t2; 
t1=find(a); 
t2=find(b); 
if (t1!=t2) 
f[t2]=t1;
}
main()
{
scanf("%d%d",&n,&m); 
for (int i=1;i<=n;i++) 
f[i]=i; 
for (int i=1;i<=m;i++) 
for (int j=1;j<=3;j++)
{
int a; scanf("%d",&a); 
union_set(i,a);
} 
for (int i=1;i<=n;i++) 
if (f[i]==i) num++; 
cout<<num;
}


果然我还是不喜欢高精度(或者是高精度不喜欢我吗QAQ)
2.Hankson的趣味题 

题目描述 Description

Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Hankson。现
在,刚刚放学回家的Hankson 正在思考一个有趣的问题。
今天在课堂上,老师讲解了如何求两个正整数c1 和c2 的最大公约数和最小公倍数。现
在Hankson 认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”和“求公
倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数a0,a1,b0,b1,设某未知正整
数x 满足:
1. x 和a0 的最大公约数是a1;
2. x 和b0 的最小公倍数是b1。
Hankson 的“逆问题”就是求出满足条件的正整数x。但稍加思索之后,他发现这样的
x 并不唯一,甚至可能不存在。因此他转而开始考虑如何求解满足条件的x 的个数。请你帮
助他编程求解这个问题。

输入描述 Input Description

第一行为一个正整数n,表示有n 组输入数据。接下来的n 行每
行一组输入数据,为四个正整数a0,a1,b0,b1,每两个整数之间用一个空格隔开。输入
数据保证a0 能被a1 整除,b1 能被b0 整除。

输出描述 Output Description

每组输入数据的输出结果占一行,为一个整数。
对于每组数据:若不存在这样的 x,请输出0;
若存在这样的 x,请输出满足条件的x 的个数;

样例输入 Sample Input

2
41 1 96 288
95 1 37 1776

样例输出 Sample Output

6
2

数据范围及提示 Data Size & Hint

【说明】
第一组输入数据,x 可以是9、18、36、72、144、288,共有6 个。
第二组输入数据,x 可以是48、1776,共有2 个。
【数据范围】
对于 50%的数据,保证有1≤a0,a1,b0,b1≤10000 且n≤100。
对于 100%的数据,保证有1≤a0,a1,b0,b1≤2,000,000,000 且n≤2000。

萌萌哒素数筛和一大堆乱七八糟的东西
时间不够就搞了个GCD和LCM交上去开心的过了五个点然后TLE了一片www
正解是素数筛然后分解质因数然后质因数个数乘积得到正解
丑陋的代码照着别人的改过了我就不贴出来了。。。
感谢TA神和Sunshine君提供的帮助和网络上的资料援助。
 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值