需要注意到两个东西
**
1.符合条件的数可以拆成一堆11...1111...11相加的形式,比如:1145=1111+11+11+11+11145=1111+11+11+11+1
2.1,11,111,1111,...1,11,111,1111,...模pp会出现循环,循环节长度不超过pp
**
还有就是11...1111...11最多为99个,然后就可以dpdp了。
首先需要统计长度为1−n1−n的全11串中有多少个模pp为rr,记为cnt[r]cnt[r],这个可以O(p)O(p)的预处理出来
接着设f[k][i][j]f[k][i][j]表示在cnt[1]−cnt[i]cnt[1]−cnt[i]中已经选了kk个,且它们的和模pp为jj的方案数。为什么是88而不是99呢?因为我们至少要选一个长度为nn的全11串,为了方便,我们在dpdp之前就把它选出来,相当于占用了99个中的11个
还有就是那个组合是可重组合
细节看代码吧:
#include <bits/stdc++.h>
using namespace std;
#define $SHOW(x) cout << #x" = " << x << endl
#define ll long long
#define MOD 999911659
#define MAXN 500
ll n, P, all, cnt[MAXN + 5], inv[10]; // all代表长度为n的全1串模p的值
int st, len, pos[MAXN + 5], f[10][MAXN + 5][MAXN + 5];
void add(int &x, int y) {
x = (x + y) % MOD;
if(x < 0) x += MOD;
}
int