HDU 3123 GCC(同余模定理)
生活随笔
收集整理的這篇文章主要介紹了
HDU 3123 GCC(同余模定理)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
GCC
大意:給一個n,一個m,求(0! + 1! + 2! + 3! + 4! + ... + n!)%m ? ? 0 <= n < 10^100 ? ? ? ??0 < m < 1000000 ??
思路:n可以達到10^100,很明顯不能直接處理。但是發現只要n>m,那么m!+(m+1)!+...+n!這些項都是可以被m整除的,要對m求余,只需要找比m小的階乘即可,而m的范圍為1000000,在O(m)的復雜度下是可以完成的。所以只需判斷n是否大于m,若大于m,則取m-1即可,若小于m則不變。
1 #include <map> 2 #include <queue> 3 #include <stack> 4 #include <math.h> 5 #include <stdio.h> 6 #include <string.h> 7 #include <iostream> 8 #include <algorithm> 9 #define LL long long 10 using namespace std; 11 12 void run() 13 { 14 int n, m; 15 char s[1010]; 16 scanf("%d", &n); 17 while(n--) 18 { 19 int t = 0; 20 scanf("%s%d%*c", s, &m); 21 ///輸入可能是很大的數據(10^100)所以要用字符串處理 22 int len = strlen(s); 23 if(len >= 7) ///判斷輸入是否大于1000000 24 t = m-1; 25 else 26 { 27 int p = 1; 28 for(int i = len-1; i >= 0; i--) 29 { 30 t += (s[i]-'0')*p; 31 p *= 10; 32 } 33 } 34 if(t >= m) 35 t = m-1; 36 LL temp = 1, ans = 1; 37 for(LL i = 1; i <= t; i++) ///處理階乘之和 38 { 39 temp = (temp*i)%m; 40 ans = (ans+temp)%m; 41 } 42 ans %= m; 43 printf("%lld\n", ans); 44 } 45 } 46 47 int main(void) 48 { 49 run(); 50 51 return 0; 52 } GCC?
同余定理:
1)a≡a(mod d) 2)a≡b(mod d)→b≡a(mod d) 3)(a≡b(mod d),b≡c(mod d))→a≡c(mod d) 如果a≡x(mod d),b≡m(mod d),則 4)a+b≡x+m (mod d) 5)a-b≡x-m (mod d) 6)a*b≡x*m (mod d ) 7)a≡b(mod d)則a-b整除d?
?
同余定理具有可加、可減、可乘、乘方性: ?
(A + B) % C = (A % C + B % C) % C;
(A - B) % C = (A % C - B % C) % C;
(A * B) % C = (A % C * B % C) % C;
(A ^ B) % C = (A^N + B^N) % C;
?
注:寫的時候腦殘了,感謝大神的指教,感謝!
轉載于:https://www.cnblogs.com/Silence-AC/p/3407739.html
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的HDU 3123 GCC(同余模定理)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: socket的NIO操作
- 下一篇: Silverlight数据绑定之Data