真被卡了还是复杂度错误,只能获得63分。
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
int x=0,f=1;char C=getchar();
while(C<'0'||C>'9'){if(C=='-')f=-1;C=getchar();}
while(C>='0'&&C<='9')x=x*10+(C^48),C=getchar();
return x*f;
}
inline void write(int x){
if(x<0){putchar('-'); x=-x;}
if(x>9)write(x/10);
putchar(x%10+'0');
}
bool Ck(char c){return c!=' '&&c!='\n'&&c!='\r';}
inline void rd(char s[], int &n){
n=0;
s[++n]=getchar();
while(!Ck(s[n]))s[n]=getchar();
while(Ck(s[n]))s[++n]=getchar();
--n;
}
const int N = 5e5+5;
bool St;
int n,p;
int a[N], ans;
int C[10][10];
struct Node{
int num[100], n;
inline void init(int x){
n = 0;
while(x){
num[++n] = x % p;
x /= p;
}
}
inline int add(int x){
int ret = 1;
for(int i = 1; x; i++){
if(i > n) num[++n] = 0;
if(num[i] + x % p >= p){
return 0;
}
num[i] += x % p;
ret = ret * C[num[i]][x%p] % p;
x /= p;
}
return ret;
}
};
bool Ed;
signed main()
{
//freopen("data.txt","r",stdin);
//cerr<< (&Ed - &St) / 1024 / 1024.0 << endl;
n=read();p=read();
C[0][0] = 1;
for(int i = 1; i <= p; i++){
C[i][0] = 1;
for(int j = 1; j <= i; j++){
C[i][j] = (C[i-1][j] + C[i-1][j-1]) % p;
}
}
for(int i = 1; i <= n; i++){
a[i] = read();
}
for(int l = 1; l <= n; l++){
int cur = 1;
Node sum; sum.init(a[l]);
ans += cur;
for(int r = l + 1; r <= n; r++){
int f = sum.add(a[r]);
if(!f){
break;
}
cur = cur * f % p;
ans += cur;
}
}
write(ans);
return 0;
}