赚钱买房(java大数+逆元+等比数列求和+快速幂)
来源:互联网 发布:淘宝喵喵 官换机 编辑:程序博客网 时间:2024/06/05 07:56
这一题的思想就是等比数列求和,求和过程中需要用到快速幂方法!
求完和之后对这个数求模!求模用到了逆元,什么是逆元呢?
今天我们来探讨逆元在ACM-ICPC竞赛中的应用,逆元是一个很重要的概念,必须学会使用它。
对于正整数和,如果有,那么把这个同余方程中的最小正整数解叫做模的逆元。
逆元一般用扩展欧几里得算法来求得,如果为素数,那么还可以根据费马小定理得到逆元为。
推导过程如下
求现在来看一个逆元最常见问题,求如下表达式的值(已知)
当然这个经典的问题有很多方法,最常见的就是扩展欧几里得,如果是素数,还可以用费马小定理。
但是你会发现费马小定理和扩展欧几里得算法求逆元是有局限性的,它们都会要求与互素。实际上我们还有一
种通用的求逆元方法,适合所有情况。公式如下
现在我们来证明它,已知,证明步骤如下
这个就是逆元!
这个公式就是我们要求的数!
逆元就想上面哪个公式求!
#include<cstdio>#include<cmath>#include<iostream>#define ll long longusing namespace std;ll pow_mod(ll a,ll n,ll m){ ll ans = 1; a = a % m; while(n>0) { if(n%2 ==1) ans=(ans*a)%m; n=n/2; a=(a*a) % m; } return ans;}int main(){ ll a,n,b,sum1,sum2,i,sum3; while(scanf("%lld%lld%lld",&a,&n,&b)!=EOF) { sum1=9*b; cout<<"模式:"<<pow_mod(10,n,sum1)<<endl; sum3=(pow_mod(10,n,sum1)-1%sum1)%sum1; cout<<sum3<<endl; sum2=((a%sum1)*(sum3%sum1))%sum1; sum2/=9; cout<<b-sum2<<endl; }}/*0 9999999 21474836465 9999999 4564654652012456840 1000 32054879653 1000 5468132147483646 0 544568 9999999 568768456213 9999999 21474836469999999 9999999 9999999214748364610989315012305945422193264552279999999*/C++在运算过程中超了ll的值,所以我们需要重新想办法!
这里我用了java大数!正好连第二题也给过了!
import java.math.BigInteger;import java.util.Scanner;import java.math.*;public class Main {public static void main(String[] args){Scanner cin=new Scanner(System.in);BigInteger sum2,a,b,sum1,sum3;int n;while (cin.hasNext()) {a=cin.nextBigInteger();n=cin.nextInt();b=cin.nextBigInteger();sum1=BigInteger.valueOf(9).multiply(b);sum3=(pow_mod(BigInteger.valueOf(10),n,sum1).subtract((BigInteger.valueOf(1).remainder(sum1)))).remainder(sum1);sum2=((a.remainder(sum1)).multiply(sum3.remainder(sum1))).remainder(sum1);sum2=sum2.divide(BigInteger.valueOf(9));System.out.println(b.subtract(sum2));}}private static BigInteger pow_mod(BigInteger a, int n,BigInteger m) {BigInteger ans = BigInteger.valueOf(1); a = a.remainder(m); while(n>0) { if(n%2 ==1) ans=(ans.multiply(a)).remainder(m); n=n/2; a=a.multiply(a).remainder(m); } return ans;}}
发一下第二题的题目!
ok!呵呵!
0 0
- 赚钱买房(java大数+逆元+等比数列求和+快速幂)
- 等比数列求和 (快速幂 + 逆元)
- 51nod 1013 3的幂的和(等比数列求和_快速幂+逆元)
- codeforces-327C Magic Five(等比数列求和+快速幂+逆元)
- POJ1845Sumdiv(逆元or等比数列求和)
- 等比数列求和快速幂
- POJ 1845 Sumdiv (逆元 等比数列求和)
- 等比数列求和+逆元——算
- HDU1588 Gauss Fibonacci (矩阵快速幂+等比数列二分求和)
- 快速矩阵幂+二分等比数列求和
- agile java 等比数列求和
- 洛谷 P2715 约数和(唯一分解定理+等比数列求和+乘法逆元)
- hdu 1588 Gauss Fibonacci(斐波那契,等比数列求和,矩阵快速幂)
- POJ 3233 Matrix Power Series (矩阵快速幂+等比数列二分求和)
- HDU1588-Gauss Fibonacci(矩阵快速幂+等比数列二分求和)
- hdoj 1588 矩阵快速幂 二分等比数列求和模板
- POJ 3233 Matrix Power (矩阵快速幂+等比数列求和)
- 规律、等比数列、逆元
- 1005. Spell It Right (20)
- 黑马程序员—网络编程
- 线程级并发
- 代理练习 两个UIView界面之间的传值--Delegate
- linux网络设备驱动DM9000驱动分析(2)
- 赚钱买房(java大数+逆元+等比数列求和+快速幂)
- Leetcode|Sqrt(x)
- 娱乐网:www.7899sunbet.com
- nutch2.2.1+mysql集成教程
- 黑马程序员--接口
- 黑马day14 监听器之javaBean对象的活化和钝化
- Reverse Bits
- block传值的简单使用
- main函数被调用时传递的三个参数