描述

zzx和city在玩一款小游戏的时候,游戏中有一个宝石合成的功能,需要m个宝石才可以合成下一级的宝石(例如需要m个1级宝石才能合成2级宝石)。

这时候zzx问city说“我要合成A级宝石需要多少个B级的宝石(A>B)。”

city说:“这数字会好大的。”

zzx:“没事的,你选择一个数取余数就行了,你只要告诉我余数就好了”

city:“那就对梅森素数取余好了”

但最后,由于数字过于大,city又不想手算了,于是想请你帮忙。

输入

多组数据,输入到文件结束为止

每组输入4个正数m,A,B,K,m,A,B为题目描述的意思,K为对第K个梅森素数取余

数据保证M,A,B不会大于第K个梅森素数(K<10)

输出

一个整数为合成A级宝石需要多少个B级的宝石对第K个梅森素数取余的结果

样例输入

5 5 1 2
4 4 1 2

样例输出

2
1

提示

1.第一组样例解释:合成5级宝石需要5个4级的宝石,合成5个4级宝石需要25个3级宝石,以此类推,合成5级宝石需要625颗1级宝石,第2个梅森素数为7,625除7余2.

2.输入输出数据过于庞大,c++输入输出你应该使用scanf和printf,而不是cin和cout

3.梅森素数是由梅森数而来。所谓梅森数,是指形如2p-1的一类数,其中指数p是素数,常记为Mp 。如果梅森数是素数,就称为梅森素数。

梅森素数表

序号

p

Mp=(2p)-1

Mn的位数

发现时间

发现者

1

2

3

1

古代

古人

2

3

7

1

古代

3

5

31

2

古代

古人

4

7

127

3

古代

古人

5

13

8191

4

1456

无名氏

6

17

131071

6

1588

Cataldi

7

19

524287

6

1588

Cataldi

8

31

2147483647

10

1772

欧拉

9

61

2305843009213693951

19

1883

Pervushin

10

89

618970019642690137449562111

27

1911

Powers

题意

输出合成A级宝石需要多少个B级的宝石对第K个梅森素数取余后的值

题解

典型的快速乘+快速幂m^(A-B)%f[k],f[k]代表第k个梅森素数

这题当时是比赛的时候做的题,不会存第9个梅森素数所以没做出来

这个题有3个坑:

1.存第9个梅森素数(2305843009213693951LL)

2.m^(A-B)其中A-B太大会超时(快速幂)

3.第9个素数相乘超过19位爆int64(快速乘)

代码

 #include<stdio.h>
__int64 multi(__int64 m,__int64 n,__int64 mod){
__int64 ans=;
while(n){
if(n&)ans+=m;
m=(m+m)%mod;
m%=mod;
ans%=mod;
n>>=;
}
return ans;
}
__int64 pow(__int64 a,__int64 n,__int64 mod){
__int64 ans=;
while(n){
if(n&)ans=multi(ans,a,mod);
a=multi(a,a,mod);
ans%=mod;
a%=mod;
n>>=;
}
return ans;
}
int main(){
__int64 f[]={,,,,,,,,,2305843009213693951LL};//存19位最后加LL
__int64 m,a,b,k;
while(scanf("%I64d%I64d%I64d%I64d",&m,&a,&b,&k)!=EOF){
m%=f[k];
printf("%I64d\n",pow(m,a-b,f[k]));
}
return ;
}

TZOJ 5291 游戏之合成(快速幂快速乘)的更多相关文章

  1. HDU 4549 矩阵快速幂+快速幂+欧拉函数

    M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

  2. 取模性质,快速幂,快速乘,gcd和最小公倍数

    一.取模运算 取模(取余)运算法则: 1. (a+b)%p=(a%p+b%p)%p; 2.(a-b)%p=(a%p-b%p)%p; 3.(a*b)%p=(a%p * b%p)%p; 4.(a^b)%p ...

  3. ACM:a^b%p-数论-快速幂-快速乘

    a^b Time Limit: 1000MS   Memory Limit: 65535KB   64bit IO Format: Description 求a的b次方,取模mod(1<=a,b ...

  4. BZOJ-2326 数学作业 矩阵乘法快速幂+快速乘

    2326: [HNOI2011]数学作业 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1564 Solved: 910 [Submit][Statu ...

  5. BZOJ-2875 随机数生成器 矩阵乘法快速幂+快速乘

    题目没给全,吃X了... 2875: [Noi2012]随机数生成器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1479 Solved: 829 ...

  6. HDU 5607 graph 矩阵快速幂 + 快速幂

    这道题得到了学长的助攻,其实就是一个马尔科夫链,算出一步转移矩阵进行矩阵快速幂就行了,无奈手残 这是我第一回写矩阵快速幂,写的各种毛病,等到调完了已经8点44了,交了一发,返回PE,(发现是少了换行) ...

  7. 快速幂&快速乘法

    尽管快速幂与快速乘法好像扯不上什么关系,但是东西不是很多,就一起整理到这里吧 快速幂思想就是将ax看作x个a相乘,用now记录当前答案,然后将指数每次除以2,然后将当前答案平方,如果x的2进制最后一位 ...

  8. A^B mod C (快速幂+快速乘+取模)题解

    A^B mod C Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,B,C<2^63). ...

  9. hdu4549 M斐波那契数列 矩阵快速幂+快速幂

    M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n]的 ...

随机推荐

  1. C++中map用法详解《转》

    Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作! . map最基本的构造函数: map<string ...

  2. libcurl+OpenSSL 库分享

    首先,我要感谢这两个博客给我的帮助: https://www.cnblogs.com/findumars/p/7496122.html https://blog.csdn.net/yannanxiu/ ...

  3. Cannot detect Web Project version. Please specify version of Web Project through Maven project property <webVersion>. E.g.: <properties> <webVersion>3.0</webVersion> </properties>

    鼠标放在问题出会出现set web project version to 3.0和set web project version to 3.1两个选项 随便选一个版本就好了

  4. How to Pronounce the Letters NG – No Hard G

    How to Pronounce the Letters NG – No Hard G Share Tweet Share Most of the time when you see the lett ...

  5. C++17尝鲜:变长 using 声明

    using 声明 先来看 using 声明在类中的应用: 代码1 #include <iostream> using namespace std; struct A { void f(in ...

  6. Ajax 学习 第三篇

    1.什么是json 第一种方法 第二种方法 比较evar and jsondata 任何时候使用EVAR要特别小心,他不会管输入对象的类型 JSONLint可以在线校验代码的正确性 改写代码

  7. ztree根据treeId展开指定节点并触发单击事件

    ztree.expandNode(ztree.getNodeByParam("id",treeId,null));//展开指定节点 ztree.selectNode(ztree.g ...

  8. hdu3579-Hello Kiki-(扩展欧几里得定理+中国剩余定理)

    Hello Kiki Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. js中将类数组转换为数组的几种方法

    1.slice方法 最经典的方法,使用Array的slice方法,此方法如果不传参数的话会返回原数组的一个拷贝,因此可以用此方法转换类数组到数组: // 创建一个类数组对象 var alo = {0: ...

  10. Java中的IO流(一)

    一,IO流的分类 A,按照操作的对象不同可分为字节流与字符流 B,按照流的方向不同可分为输入(指从外部存储设备拿文件到内存)流也叫读与输出(指从内存把文件写入到外部存储设备)流也叫写 注:字节流可以操 ...