hdu4704--sum--大数幂取模

2024-06-12 12:18
文章标签 大数 sum 取模 hdu4704

本文主要是介绍hdu4704--sum--大数幂取模,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

做这道题学到了好多好多知识,想起了一些被遗忘的知识,收获还是很大的。


1.费马小定理的应用。首先说明一下什么是费马小定理:假如P是质数,且gcd(a,p)=1(即a,p互质),则a^(p-1)===1(mod p)。

   应用为:若P为质数,且gcd(a,p)=1,则可以计算 a^n mod p的值。(n为一个无法用long long存下的大数(若不为大数直接用快速幂其实就可以了))

   因为a^(p-1)%p=1,所以a^((p-1)*k)%p也为1。所以a^n mod p=a^(n%(p-1))%p;

   所以就通过这样将n转化为一个在可接受范围内的数,然后在利用快速幂求出答案。

2.学会了一个知识,即在已知a mod b=x,x已知的情况下,怎样求出 (a-1) mod b的值。值即为 (x -1+b) mod b。

  ( 切记此时x的范围是0~b-1!否则值为((x-1)mod b+b) mod b )

3.学会了大数取模时的处理方法,即通过按位一位一位取模(每算一位记得乘以10),因为模运算是可以拆分成 各个加法运算分别取模 然后加和再取模 的。

4.至于怎样得到答案为2^(n-1)这个结论的,参加离散数学书中关于排列组合中的挡板法。(2^(n-1)=C{n-1,0}+C{n-1,1}+......C(n-1,n-1))


以下是代码:

#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int maxlen=1e5+10;
const int M=1e9+7;
char a[maxlen];ll pow_mod(ll a,ll n)
{ll ans=1;while(n){if(n&1)ans*=a;if(ans>=M) ans%=M;a*=a;if(a>=M) a%=M;n>>=1;}return ans;
}
int main()
{while(~scanf("%s",a)){int len=strlen(a);ll n=0;for(int i=0;i<len;++i)//这里原来很SB的把len写成来strlen(a),结果T了好久,真是SB的可以了。。。不过也长经验了,下次不会范这么2的错误了。n=(n*10+a[i]-'0')%(M-1);//这里的思想值得多多体会n=(n-1+M-1)%(M-1);pow_mod(2,n);printf("%I64d\n",pow_mod(2,n));}return 0;
}


这篇关于hdu4704--sum--大数幂取模的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054190

相关文章

uva 10069 DP + 大数加法

代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>#include <cl

最大流=最小割=最小点权覆盖集=sum-最大点权独立集

二分图最小点覆盖和最大独立集都可以转化为最大匹配求解。 在这个基础上,把每个点赋予一个非负的权值,这两个问题就转化为:二分图最小点权覆盖和二分图最大点权独立集。   二分图最小点权覆盖     从x或者y集合中选取一些点,使这些点覆盖所有的边,并且选出来的点的权值尽可能小。 建模:     原二分图中的边(u,v)替换为容量为INF的有向边(u,v),设立源点s和汇点t

如何导入sun.misc.BASE64Encoder和sum.misc.BASE64Decoder

右击项目名--->Build Path--->Configure Build Path...--->java Build Path--->Access rules:1 rule defined,added to all librar...   --->Edit --->Add...

Java验证辛钦大数定理

本实验通过程序模拟采集大量的样本数据来验证辛钦大数定理。   实验环境: 本实验采用Java语言编程,开发环境为Eclipse,图像生成使用JFreeChart类。   一,验证辛钦大数定理 由辛钦大数定理描述为: 辛钦大数定理(弱大数定理)  设随机变量序列 X1, X2, … 相互独立,服从同一分布,具有数学期望E(Xi) = μ, i = 1, 2, …, 则对于任意正数ε ,

找第K大数(ACdream 1099)

瑶瑶的第K大 Time Limit: 4000/2000MS (Java/Others)  Memory Limit: 256000/128000KB (Java/Others) Submit  Statistic  Next Problem Problem Description 一天,萌萌的妹子--瑶瑶(tsyao)很无聊,就来找你玩。可是你们都不知道玩什么。。。

18. 4 Sum

题目: 解答: 与之前的三数之和的解法类似,也是先排序,然后不断剔除不可能的条件,最后两个参数,通过两头求和计算得出。 代码: class Solution {public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> result;int len = nums.size

apt-get update更新源时,出现“Hash Sum mismatch”问题

转载自:apt-get update更新源时,出现“Hash Sum mismatch”问题 当使用apt-get update更新源时,出现下面“Hash Sum mismatch”的报错,具体如下: root@localhost:~# apt-get update ...... ...... W: Failed to fetch http://us.archive.ubuntu.com/ub

[LeetCode] 303. Range Sum Query - Immutable

题:https://leetcode.com/problems/range-sum-query-immutable/description/ 题目 Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive. Example: Given nums

[LeetCode] 64. Minimum Path Sum

题:https://leetcode.com/problems/minimum-path-sum/description/ 题目 Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers