HDU 4704 歐拉定理
阿新 • • 發佈:2017-09-12
++ amp class auth http char namespace urn ear
題目看了很久沒看懂
就是給你數n,一種函數S(k),S(k)代表把數n拆成k個數的不同方案數,註意如n=3,S(2)是算2種的,最後讓你求S(1~n)的和模1e9+7,n<=1e100000。那麽其實一個S(k)就是把n個小球放到k-1個盒子裏的種類數,求和也就是求個$2^{n-1}$。
n超大,但是模數只有1e9+7,用歐拉定理就行了。
/** @Date : 2017-09-12 18:41:59 * @FileName: HDU 4704 歐拉定理 降冪.cpp * @Platform: Windows * @Author : Lweleth ([email protected]) * @Link : https://github.com/ * @Version : $Id$ */ #include <bits/stdc++.h> #define LL long long #define PII pair<int ,int> #define MP(x, y) make_pair((x),(y)) #define fi first #define se second #define PB(x) push_back((x)) #define MMG(x) memset((x), -1,sizeof(x)) #define MMF(x) memset((x),0,sizeof(x)) #define MMI(x) memset((x), INF, sizeof(x)) using namespace std; const int INF = 0x3f3f3f3f; const int N = 1e5+20; const double eps = 1e-8; const LL mod = 1e9 + 7; const LL phi = 1e9 + 6; char a[N]; LL fpow(LL a, LL n) { LL res = 1; while(n) { if(n & 1) res = (res * a % mod + mod) % mod; a = a * a % mod; n >>= 1; } return res; } int main() { while(~scanf("%s", a)) { LL n = 0; for(int i = 0; i < strlen(a); i++) { n = ((n * 10LL) % phi + (LL)(a[i] - ‘0‘) ) % phi; } n = (n - 1 + phi) % phi; while(n < 0) n += phi; LL ans = fpow(2, n % phi + phi); printf("%lld\n", ans); } return 0; }
HDU 4704 歐拉定理