赚钱买房(java大数+逆元+等比数列求和+快速幂)

转载 2015年07月06日 19:03:35

这一题的思想就是等比数列求和,求和过程中需要用到快速幂方法!


求完和之后对这个数求模!求模用到了逆元,什么是逆元呢?


今天我们来探讨逆元在ACM-ICPC竞赛中的应用,逆元是一个很重要的概念,必须学会使用它。

 

对于正整数,如果有,那么把这个同余方程中的最小正整数解叫做的逆元。

 

逆元一般用扩展欧几里得算法来求得,如果为素数,那么还可以根据费马小定理得到逆元为

 

推导过程如下

                            

 

求现在来看一个逆元最常见问题,求如下表达式的值(已知

 

           

 

当然这个经典的问题有很多方法,最常见的就是扩展欧几里得,如果是素数,还可以用费马小定理。

 

但是你会发现费马小定理和扩展欧几里得算法求逆元是有局限性的,它们都会要求互素。实际上我们还有一

种通用的求逆元方法,适合所有情况。公式如下

 

         

 

现在我们来证明它,已知,证明步骤如下

 

         

 

这个就是逆元!


这个公式就是我们要求的数!

逆元就想上面哪个公式求!

#include<cstdio>
#include<cmath>
#include<iostream>
#define ll long long
using 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 2147483646
5 9999999  456465465
2012456840 1000 3
2054879653 1000 546813
2147483646 0 54
4568 9999999 5687
68456213 9999999 2147483646
9999999 9999999 9999999

2147483646
109893150
1
230594
54
2219
326455227
9999999
*/
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!呵呵!







大数组合数取模(逆元+打表)

将阶乘O(n)打表之后C(n,m)便可O(1)求出,除法取模用逆元解决 hdu5698瞬间移动#include using namespace std; const int maxn=200000;...
  • daniel_csdn
  • daniel_csdn
  • 2016年05月23日 11:04
  • 1110

自己动手写Java大整数《4》扩展欧几里得和Mod逆

之前已经完成了大整数的表示、绝对值的比较大小、取负值、加减法运算、乘法运算以及除法和余数运算。具体见我的主页前三篇博客(自己动手写Java 系列 )。 这篇博客添加求大整数GCD、扩展欧几里得算法和求...
  • XUE_HAIyang
  • XUE_HAIyang
  • 2014年07月28日 16:11
  • 818

agile java 等比数列求和

好久没有写过东西了,最近正在看agile java (测试驱动开发)这本书,其开发思想方面的不再细说,下面这个是前两天在QQ群里的群友求助的——等比数列前N项和的算法,根据测试驱动开发的思想,写了这个...
  • xiaolei168
  • xiaolei168
  • 2010年08月17日 13:10
  • 956

Geometric Progression(等比数列的判断+java大数(同时附上别人很完美的C++大数模板))

Link:http://acm.hdu.edu.cn/showproblem.php?pid=5429 Geometric Progression Time Limit: 2000/100...
  • Enjoying_Science
  • Enjoying_Science
  • 2015年09月05日 23:07
  • 831

Codeforces 18D Seller Bob java大数+贪心

题目链接:点击打开链接 java: import java.math.BigInteger; import java.util.Scanner; public class Main { sta...
  • qq574857122
  • qq574857122
  • 2014年06月28日 23:23
  • 1146

赚钱买房(java大数+逆元+等比数列求和+快速幂)

这一题的思想就是等比数列求和,求和过程中需要用到快速幂方法! 求完和之后对这个数求模!求模用到了逆元,什么是逆元呢? 今天我们来探讨逆元在ACM-ICPC竞赛中的应用,逆元是一...
  • baidu_23955875
  • baidu_23955875
  • 2015年07月06日 19:03
  • 628

等比数列求和 (快速幂 + 逆元)

求一个等比数例之和, 并让他对一个数取模。     用到等比数列求和公式, 快速幂, 逆元。      不会证明, 下面给出代码。 #include #include #include type...
  • qq_38737992
  • qq_38737992
  • 2017年10月11日 10:37
  • 135

逆元+快速幂+模板

今天我们来探讨逆元在ACM-ICPC竞赛中的应用,逆元是一个很重要的概念,必须学会使用它。   对于正整数和,如果有,那么把这个同余方程中的最小正整数解叫做模的逆元。   逆元一般用扩展欧几里...
  • hhu1506010220
  • hhu1506010220
  • 2016年07月30日 19:37
  • 460

一个数求逆元

  • 2012年07月20日 12:04
  • 258KB
  • 下载

hdu 5050 java大数进制转换

import java.io.*; import java.math.BigInteger; import java.util.StringTokenizer; class Scan { ...
  • cqsh3vj2
  • cqsh3vj2
  • 2014年09月28日 11:01
  • 642
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:赚钱买房(java大数+逆元+等比数列求和+快速幂)
举报原因:
原因补充:

(最多只允许输入30个字)