| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
母函数/*************************************************************************
> File Name: 3181.cpp
> Author: Netcan
> Blog: http://www.netcan.xyz
> Mail: 1469709759@qq.com
> Created Time: 2015-10-03 六 16:14:09 CST
************************************************************************/
#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <sstream>
#include <deque>
#include <functional>
#include <iterator>
#include <list>
#include <map>
#include <memory>
#include <stack>
#include <set>
#include <numeric>
#include <utility>
#include <cstring>
using namespace std;
const int MAX_N = 1005;
int N, K;
struct BigInt {
const static int nlen = 4; // 控制每个数组数字长度,默认为4,计算乘法的时候每个数组相乘也不会溢出int范
const static int mod = 10000; // 值为10^nlen
short n[10], len; // 最多存4*1000位长度,可调,short占的内存小,但是速度慢
BigInt() {
memset(n, 0, sizeof(n));
len = 1;
} BigInt(int num) {
len = 0;
while (num > 0) {
n[len++] = num % mod;
num /= mod;
}
}
BigInt(const char *s) {
int l = strlen(s);
len = l % nlen == 0 ? l / nlen : l / nlen + 1;
int index = 0;
for (int i = l - 1; i >= 0; i -= nlen) {
int tmp = 0;
int j = i - nlen + 1;
if (j < 0)
j = 0;
for (int k = j; k <= i; ++k)
tmp = tmp * 10 + s[k] - '0';
n[index++] = tmp;
}
}
BigInt operator+(const BigInt & b) const { // 加法
BigInt res;
res.len = max(len, b.len);
for (int i = 0; i < res.len; ++i) {
res.n[i] += (i < len ? n[i] : 0) + (i < b.len ? b.n[i] : 0);
res.n[i + 1] += res.n[i] / mod;
res.n[i] = res.n[i] % mod;
} if (res.n[res.len] > 0)
++res.len;
return res;
}
BigInt operator*(const BigInt & b) const { // 乘法
BigInt res;
for (int i = 0; i < len; ++i) { // 类似母函数,第一个数组
int up = 0; // 进位
for (int j = 0; j < b.len; ++j) { // 第二个数组
int tmp = n[i] * b.n[j] + up + res.n[i + j]; // 控制nlen=4是防止tmp溢出
res.n[i + j] = tmp % mod;
up = tmp / mod;
} if (up != 0)
res.n[i + b.len] = up;
}
res.len = len + b.len;
while (res.n[res.len - 1] == 0 && res.len > 1)
--res.len;
return res;
}
void show() const {
printf("%d", n[len - 1]); // 先输出最高位,后面可能需要前导0
for (int i = len - 2; i >= 0; --i)
printf("%04d", n[i]); // 前导0,%04d和nlen一致
printf("\n");
}};
BigInt c1[MAX_N], c2[MAX_N];
void solve()
{
for (int i = 0; i <= N; ++i) {
c1[i] = 1;
c2[i] = 0;
}
for (int i = 2; i <= K; ++i) {
for (int j = 0; j <= N; ++j) {
for (int k = 0; k + j <= N; k += i) {
c2[k + j] = c2[k+j] + c1[j];
}
}
for (int j = 0; j <= N; ++j) {
c1[j] = c2[j];
c2[j] = 0;
}
}
c1[N].show();
}
int main()
{
#ifdef Oj
freopen("3181.in", "r", stdin);
#endif
cin >> N >> K;
solve();
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator