tyvj/joyoi 1374 火车进出栈问题(水水版)
我受不了了。
Catalan数第100项,30000项,50000项,cnm
这tm哪里是在考数学,分明是在考高精度,FFT......
有剧毒!
我只得写高精度,只能过100的那个题,两个进化版超时......
1 #include <cstdio> 2 #include <string> 3 using namespace std; 4 const int N = 100010; 5 6 int p[N], tp, sum[N]; 7 bool vis[N]; 8 9 struct LL { 10 string n; 11 LL operator * (const long long &x) const { 12 int a[N]; 13 int t = n.size(); 14 for(int i = 0; i < t; i++) { 15 a[t - i - 1] = ((int)(n[i] - '0')) * x; 16 } 17 for(int i = 0; i < t; i++) { 18 if(a[i] > 9) { 19 a[i + 1] += a[i] / 10; 20 a[i] %= 10; 21 if(i + 1 == t) t++; 22 } 23 } 24 string f = ""; 25 for(int i = 0; i < t; i++) { 26 f = (char)(a[i] + '0') + f; 27 } 28 LL ans; 29 ans.n = f; 30 return ans; 31 } 32 void out() { 33 for(int i = 0; i < n.size(); i++) { 34 putchar(n[i]); 35 } 36 return; 37 } 38 }; 39 40 void getprime(int b) { 41 for(int i = 2; i <= b; i++) { 42 if(!vis[i]) { 43 p[++tp] = i; 44 } 45 for(int j = 1; j <= tp && p[j] * i <= b; j++) { 46 vis[p[j] * i] = 1; 47 if(i % p[j] == 0) { 48 break; 49 } 50 } 51 } 52 return; 53 } 54 55 inline long long pow(int a, int b) { 56 if(b < 0) { 57 printf("ERROR!!!\n"); 58 return 1; 59 } 60 long long ans = 1; 61 while(b) { 62 if(b & 1) { 63 ans = ans * a; 64 } 65 a = a * a; 66 b = b >> 1; 67 } 68 return ans; 69 } 70 71 int main() { 72 int n; 73 scanf("%d", &n); 74 getprime(n << 1); 75 int n2 = n << 1; 76 77 for(int i = 1; i <= tp; i++) { 78 int _i = p[i]; 79 while(_i <= n2) { 80 sum[i] += n2 / _i; 81 _i *= p[i]; 82 } 83 } 84 for(int i = 1; i <= tp && p[i] <= n; i++) { 85 int _i = p[i]; 86 while(_i <= n) { 87 sum[i] -= n / _i; 88 _i *= p[i]; 89 } 90 } 91 n++; 92 for(int i = 1; i <= tp && p[i] <= n; i++) { 93 int _i = p[i]; 94 while(_i <= n) { 95 sum[i] -= n / _i; 96 _i *= p[i]; 97 } 98 } 99 100 LL ans; 101 ans.n = '1'; 102 for(int i = 1; i <= tp; i++) { 103 ans = ans * pow(p[i], sum[i]); 104 } 105 ans.out(); 106 return 0; 107 }