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 }
AC代码

 

posted @ 2018-05-17 13:22  garage  阅读(108)  评论(0编辑  收藏  举报