1. 程式人生 > >4704(費馬小定理和同餘定理 ,求超高次冪)

4704(費馬小定理和同餘定理 ,求超高次冪)

Input

2

Output

2

        
 

Hint

1. For N = 2, S(1) = S(2) = 1.2. The input file consists of multiple test cases. Sample Input

2

Sample Output

2

題意: 求出 將N 分成 1堆,2堆,...,N堆 的結果累加

考慮 將 N 分成 X 堆,考慮隔板法,也就是 \textrm{C}_{n-1}^{x-1}, 所以結果也就是 C_{n-1}^{0}+C_{n-1}^{1}+...C_{n-1}^{n-1} , 也就是 2^{n-1}

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int mod=1e9+7;
 
char str[maxn];
/*
題目分析:
  因為n實在是太大太大了,這可咋辦啊?!n<10^100000。
  做這場的時候沒有注意到,也是當時沒有看過什麼是費馬小定理,居然跟模值有關係!mod=1000000007。這個mod有什麼特點呢?它是個質數。
  費馬小定理揭示了:當p是一個素數並且a和p互質時,a^(p-1)%p≡1。
  那麼在這道題裡a=2,p=mod。顯然滿足費馬小定理。再根據同餘模定理,
   那麼a^(n-1)=a^(m+k*(p-1))。因而a^(n-1)%p=1*a^m
  這麼我們就可以斷定mod-1是一個迴圈節。先用大數對它取模,然後資料量就可以承受得起了,再用快速冪,這道題就解了!
*/
 
ll get_pow_num(int len,int mod){
	ll ans=0;
	for(int i=0;i<len;i++){
		ans=((ans*10)%mod+str[i]-'0')%mod;
	}
	return ans;
}
 
ll pow_mod(ll base,ll n,int mod){
	ll ans=1;
	while(n){
		if(n&1)	ans=(ans*base)%mod;
		n/=2;
		base=(base*base)%mod;
	}
	return ans;
}
 
int main(){
	while(scanf("%s",str)==1){
		int len=strlen(str);
		ll pow_num=(get_pow_num(len,mod-1)-1+mod-1)%(mod-1);
		ll ans=pow_mod(2,pow_num,mod);
		printf("%lld\n",ans);
	}
	return 0;
}

相關推薦

4704定理定理 超高

Input 2 Output 2 Hint 1. For N = 2, S(1) = S(2) = 1.2. The input file consists of multiple test cases. Sample Input

HUD 4704 Sum 定理快速

給定s(k)為k的劃分數 求劃分數的個數 比如當n=4時候 s(1)=(4)…………………………1 s(2)=(2,2)(1,3)(3,1)………3 s(3)=(1,1,2)(1,2,1)(2,1,1)……3 s(4)=(1,1,1,1)……………………1 所以是1+3+

HDU 4704 Sum 定理

題意: 不知道為什麼java超時: import java.math.BigInteger; import java.util.Scanner; public class Main {

hdu 4704 Sum定理

數論,費馬小定理 a^(p-1) % p == 1,長見識了 #include <cstdio> #include <algorithm> #include <vector> using namespace std; typedef

hdu 4704 Sum定理解題報告

Problem Description Sample Input 2 Sample Output 2 Hint 1. For N = 2, S(1) = S(2) = 1. 2. The input file consists of multip

HDOJ 4704 Sum定理+快速

Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Subm

HDOJ 題目4704 Sum定理快速

Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Subm

hdu 4704 sum定理+快速

題意:   這題意看了很久。。     s(k)表示的是把n分成k個正整數的和,有多少種分法。   例如: n=4時, s(1)=1     4   s(2)=3     1,3      3,1       2,2      s(3)=3     1,1,2     

4704 Sum 定理 + 快速

Description Sample Input 2 Sample Output 2 Hint 1. For N = 2, S(1) = S(2) = 1. 2. The input file consists of mul

HDU - 1576定理逆元

math src typedef pow ble inpu show font type 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1576 A/B Time Limit: 1000/1000 MS (Java/Othe

2018 CCPC網絡賽 Dream 定理

turn adc per -- bottom from ever img making Dream Problem Description Freshmen frequently make an error in computing the power of a sum o

題解報告:hdu 6440 Dream定理+構造

sin hdu 給定 集合 代碼 \n png mes 乘法 解題思路:給定素數p,定義p內封閉的加法和乘法運算(運算封閉的定義:若從某個非空數集中任選兩個元素(同一元素可重復選出),選出的這兩個元素通過某種(或幾種)運算後的得數仍是該數集中的元素,那麽,就說該集合對於

919E - Congruence Equation定理

919E - Congruence Equation 題目大意: 給定 a a a, b b b, x

牛客網-F-發電定理+線段樹

連結:https://www.nowcoder.com/acm/contest/136/F 來源:牛客網   時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 262144K,其他語言524288K 64bit IO Format: %lld 題目描述  

HDU 6400定理

傳送門 題面: Freshmen frequently make an error in computing the power of a sum of real numbers, which usually origins from an incorrect equat

淺談逆元及其求法定理&Exgcd

前言 逆元其實是一個很小的知識點,但是在數論中也起到了比較大的作用。這篇文章主要是介紹逆元,和它在一些其他方面的應用。可能我在證明的過程中會出現一些錯誤,如果你在看這篇文章的過程中發現了問題,歡迎在私信或評論中指出! What is 逆元 我們想一個問

逆元定理求法

看程式碼解釋/* 求逆元 費馬小定理 a^(p-1)=1(mod p) 故 a^(p-2)=1/a(mod p) inv(a)(a關於p的逆元)=a^(p-2) */ #include<cstd

HDU 4704 Sum(定理組合數學快速)

Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Sub

[HDU 4704] Sum · 定理 & 快速

題意:給定n,設是將n分成k個數之和的方案數,求 隔板原理:將n個物品分成k組,相當於在n-1個間隔中插入k-1個隔板,方案數為,所以等於,貌似是叫二項式定理來著?反正這個式子的值等於,所以就是要求的

hdu 4704 Sum (定理+快速)

//(2^n-1)%mod //費馬小定理:a^n ≡ a^(n%(m-1)) * a^(m-1)≡ a^(n%(m-1)) (mod m) # include <stdio.h> # include <algorithm> # include &l