Dnoc3. 高精度计算
#include <iostream>
using namespace std;
long long a[110] , s[210];
int main()
{int n;cin >> n;a[100] = s[100] = 1;for(int i = 2;i <= n;i++){int jin = 0;for(int j = 100;j >= 0;j--){a[j] = a[j] * i + jin;jin = a[j] / 10;a[j] = a[j] % 10;}jin = 0;for(int j = 100;j >= 0;j--){s[j] += a[j] + jin;jin = s[j] / 10;s[j] %= 10;}}int j;for(j = 0;j <= 100;j++){ if(s[j] != 0){break;}}for( ;j <= 100;j++){cout << s[j];}return 0;
}
Danko. 2^k进制数
#include <iostream>
#include <cstring>
using namespace std;
const int N = 3e4 + 10 , mod = 10000 , Len = 4;
struct node
{int p[30] , l;node(){memset(p , 0 , sizeof(p));l = 0;}void print(){cout << p[l];for(int i=l - 1;i >= 1;i--){if(p[i] == 0){for(int i = 1;i <= Len;i++){putchar('0');}}else{for(int k = 10;k * p[i] < mod;k *= 10){cout << 0;}cout << p[i];}}}
};
node operator +(node a , node b)
{node c;c.l = max(a.l , b.l);for(int i = 1;i <= c.l;i++){c.p[i] += a.p[i] + b.p[i];c.p[i + 1] += c.p[i] / mod;c.p[i] %= mod;if(c.p[c.l + 1]){c.l++;}}return c;
}
node f[N] , sum[N] , pre[N] , ans;
int main()
{freopen("digital.in" , "r" , stdin);freopen("digital.out" , "w" , stdout);int k , w;int tail , l;cin >> k >> w;l = w / k + 1;tail = w % k;if(tail == 0){tail = k;l--;}tail = (1 << tail) - 1;for(int i = (1 << k) - 1;i >= 0;i--){f[i].l = 1;f[i].p[1] = 1;sum[i] = sum[i + 1] + f[i];}for(int i = 2;i <= l;i++){for(int j = (1 << k) - 1;j >= 1;j--){if(i == l && j > tail){continue;}f[j] = sum[j + 1];ans = ans + f[j];pre[j] = pre[j + 1] + f[j];}for(int j = (1 << k) - 1;j >= 1;j--){sum[j] = pre[j];}}ans.print();return 0;
}
Dhodv. 汉诺双塔
#include <bits/stdc++.h>
using namespace std;int main()
{int n;cin >> n;stringstream s;s.precision(0);s << fixed << pow(2.0L , n + 1);string a = s.str();a[a.size() - 1]--;a[a.size() - 1]--;cout << a << endl;return 0;
}
D605q. 麦森数
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
void cheng(int a[] , int b[])
{int temp[500 * 2] = {0};for(int i = 0;i < 500;i++){for(int j = 0;j < 500;j++){temp[i + j] += a[i] * b[j];}}for(int i = 0;i < 500;i++){temp[i + 1] += temp[i] / 10;temp[i] %= 10;}memcpy(a , temp , 500 * 4);
}
void two(int a[] , int n)
{a[0] = 1;int x[500] = {0};x[0] = 2;while(n > 0){if(n % 2 == 1){cheng(a, x);}cheng(x, x);n /= 2;}
}
int main()
{freopen("mason.in" , "r" , stdin);freopen("mason.out" , "w" , stdout);int n;cin >> n;int wei = (int)(n * log10(2)) + 1;cout << wei << endl;int a[500] = {0};two(a , n);int i = 0;while(i < 500 && a[i] == 0){a[i] = 9;i++;}if(i < 500){a[i]--;}for(int i = 500 - 1 , cnt = 0;i >= 0;i-- , cnt++){cout << a[i];if(cnt % 50 == 49){cout << endl;}}return 0;
}