EOJ3134. 短信激活码(大数幂取模)

题面

输入只有5位,所以转化为long long类型用快速幂取模

前面补0的写法printf("%05lld\n",ans);如果ans不足5位会在前面补0

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 long long mod_exp(long long a, long long b, long long c)        //快速幂取余a^b%c
 4 {
 5     long long res, t;
 6     res = 1 % c;
 7     t = a % c;
 8     while (b)
 9     {
10         if (b & 1)
11         {
12             res = res * t % c;
13         }
14         t = t * t % c;
15         b >>= 1;
16     }
17     return res;
18 }
19 int main()
20 {
21     int t;
22     while(~scanf("%d",&t))
23     {
24         int cases=-1;
25         while(t--)
26         {
27             cases++;
28             char s[10],s2[10];
29             scanf("%s",s);
30             s2[0]=s[0];
31             s2[1]=s[2];
32             s2[2]=s[4];
33             s2[3]=s[3];
34             s2[4]=s[1];
35             long long temp=(s2[0]-‘1‘+1)*10000+(s2[1]-‘1‘+1)*1000+(s2[2]-‘1‘+1)*100+(s2[3]-‘1‘+1)*10+(s2[4]-‘1‘+1)*1;
36             printf("case #%d:\n%05lld\n",cases,mod_exp(temp,5,100000));
37         }
38     }
39     return 0;
40 }

原文地址:https://www.cnblogs.com/fqfzs/p/9974722.html

时间: 2024-11-07 12:20:02

EOJ3134. 短信激活码(大数幂取模)的相关文章

大数幂取模

//大数幂取模 #include "iostream" using namespace std; //(a^b) % m int mod(int a,int b,int m){ int result = 1; for(int i=0;i<b;i++) { result = (result*a) %m; } return result; } int main(){ cout << mod(2,4,5) << endl; }

UVa 11582 Colossal Fibonacci Numbers! 【大数幂取模】

题目链接:Uva 11582 [vjudge] 题意 输入两个非负整数a.b和正整数n(0<=a,b<=2^64,1<=n<=1000),让你计算f(a^b)对n取模的值,当中f(0) = 0,f(1) =  1.且对随意非负整数i.f(i+2)= f(i+1)+f(i). 分析 全部的计算都是对n取模.设F(i) =f(i)mod n, 非常easy发现,F(x)是具有周期性的,由于对N取模的值最多也就N个,当二元组(F(i-1),F(i))反复的时候.整个序列也就反复了.周期i

快速幂取模和快乘取模

一.快速幂取模概念 快速幂取模,顾名思义,就是快速的求一个幂式的模(余),比如a^b%c,快速的计算出这个式子的值. 在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快.计算范围更大的算法,产生了快速幂取模算法. 二.快速幂取模算法实现 1)很容易能想到,循环b次,每次乘a,最后对c取余就可以了. int ans = 1; for(int i = 1; i<=b; i++) { ans = ans * a; } ans = ans % c; 这个朴素算法的问题是: 1.如果a和b

组合数取模Lucas定理及快速幂取模

组合数取模就是求的值,根据,和的取值范围不同,采取的方法也不一样. 下面,我们来看常见的两种取值情况(m.n在64位整数型范围内) (1)  , 此时较简单,在O(n2)可承受的情况下组合数的计算可以直接用杨辉三角递推,边做加法边取模. (2) ,   ,并且是素数 本文针对该取值范围较大又不太大的情况(2)进行讨论. 这个问题可以使用Lucas定理,定理描述: 其中 这样将组合数的求解分解为小问题的乘积,下面考虑计算C(ni, mi) %p. 已知C(n, m) mod p = n!/(m!(

UVA - 11029Leading and Trailing(快速幂取模取后三位 + log10()取前三位)

题目: UVA - 11029Leading and Trailing(快速幂取模取后三位 + log10()取前三位) 题目大意:给你N的k次方,然后要求你求出这个数的前三位和后三位. 解题思路:因为n和k都很大,这个数求出来是大数,所以可以用快速幂取模求后三位,因为后面的三位和前面的位数的没有关系.前面的三位比较难办.设x = log (n^k)  = k * log10(n),那么10^x = k * log10(n).将X = a(整数) + b(小数),整数部分10^a只是移动小数点,

【转】C语言快速幂取模算法小结

(转自:http://www.jb51.net/article/54947.htm) 本文实例汇总了C语言实现的快速幂取模算法,是比较常见的算法.分享给大家供大家参考之用.具体如下: 首先,所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余).在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快.计算范围更大的算法,产生了快速幂取模算法.我们先从简单的例子入手:求abmodc 算法1.直接设计这个算法: int ans = 1; for(int i =

快速幂取模(POJ 1995)

http://poj.org/problem?id=1995 以这道题来分析一下快速幂取模 a^b%c(这就是著名的RSA公钥的加密方法),当a,b很大时,直接求解这个问题不太可能 利用公式a*b%c=((a%c)*b)%c 每一步都进行这种处理,这就解决了a^b可能太大存不下的问题,但这个算法的时间复杂度依然没有得到优化 由此可以用快速幂算法优化: http://www.cnblogs.com/qlky/p/5020402.html 再结合取模公式: (a + b) % p = (a % p

快速幂及快速幂取模

快速幂顾名思义,就是快速算某个数的多少次幂.其时间复杂度为 O(log?N), 与朴素的O(N)相比效率有了极大的提高.——bybaidu 快速幂可以用位运算这个强大的工具实现. 代码: 1 int pow(int a,int b) 2 { 3 int ans=1; 4 while(b!=0) 5 { 6 if(b&1) 7 ans*=a; 8 a*=a; 9 b>>=1; 10 } 11 return ans; 12 } 快速幂取模需要记住一个定理:积的取模等于取模积的取模:算法是蒙

关于快速幂取模

今天看算法书的时候,看到一道关于快速幂取模的题,心想好像不难,便写了一下,发现我的渣渣代码写的比正常的O(N)复杂度还要慢(天知道我怎么做到的T_T),渣渣代码如下: 1 public static long fastMi(long x,long n){ 2 if(n==1){ 3 return x; 4 } 5 if(n%2==0){ 6 return fastMi(x,n/2)*fastMi(x,n/2); 7 }else{ 8 return fastMi(x,n/2)*fastMi(x,n