新浪网页打不开,外贸网站优化免费渠道,科技部,WordPress 用户密码长度正题
题目链接:https://ac.nowcoder.com/acm/contest/11193/G 题目大意
给出nnn个长度为mmm的数组#xff0c;然后你每次可以进行差分#xff08;不会改变数组长度那种#xff09;和前缀和。
如果两个数组可以在模998244353998244353998244353意义下操作成同一个数组然后你每次可以进行差分不会改变数组长度那种和前缀和。
如果两个数组可以在模998244353998244353998244353意义下操作成同一个数组那么这两个同源求所有的同源数组。
1≤n≤100,1≤m≤10001\leq n\leq 100,1\leq m\leq 10001≤n≤100,1≤m≤1000 解题思路
考虑将所有同源的操作成同一种形式。
注意到对于差分来说数组的第一个位置是保持不变的更具体地说其实是数组中从前往后第一个不是000的数字是不会变的。
设为aka_kak然后此时每次差分都会令ak1ak1−aka_{k1}a_{k1}-a_kak1ak1−ak。首先对于两个数组来说肯定得有kk′kkkk′且akak′′a_{k}a_{k}akak′′然后再考虑后面的。
为了方便比较我们之间让ak1a_{k1}ak1一直差分直到其等于000此时我们就可以直接拿两个数组比较了。
快速处理kkk阶差分的做法就直接上NTTNTTNTT乘上一个(1−x)k(1-x)^k(1−x)k二项式展开就好了
时间复杂度O(nmlogm)O(nm\log m)O(nmlogm)
Hard Version要任意模加Lucas先润了 code
#includecstdio
#includecstring
#includealgorithm
#define ll long long
#define ull unsigned long long
using namespace std;
const ll N4e310,P998244353;
struct poly{ll a[N];ll n;
}F,G;
ll n,m,cnt,a[N][N],r[N],col[N],num[N];
bool v[N];
ll power(ll x,ll b){ll ans1;while(b){if(b1)ansans*x%P;xx*x%P;b1;}return ans;
}
void NTT(ll *f,ll n,ll op){for(ll i0;in;i)if(ir[i])swap(f[i],f[r[i]]);for(ll p2;pn;p1){ll lenp1,tmppower(3,(P-1)/p);if(op-1)tmppower(tmp,P-2);for(ll k0;kn;kp){ll buf1;for(ll ik;iklen;i){ll ttf[ilen]*buf%P;f[ilen](f[i]-ttP)%P;f[i](f[i]tt)%P;bufbuf*tmp%P;}}}if(op-1){ll invnpower(n,P-2);for(ll i0;in;i)f[i]f[i]*invn%P;}return;
}
void mul(poly a,poly b){ll n1;while(na.nb.n)n1;for(ll i0;in;i)r[i](r[i1]1)|((i1)?(n1):0);NTT(a.a,n,1);NTT(b.a,n,1);for(ll i0;in;i)a.a[i]a.a[i]*b.a[i]%P;NTT(a.a,n,-1);return;
}
void Diff(ll *a,ll n,ll k){if(!k)return;memset(F.a,0,sizeof(F.a));memset(G.a,0,sizeof(G.a));for(ll i0;in;i)F.a[i]a[i];for(ll i0,ans1;imin(k,n-1);i){if(i)ansans*(k-i1)%P*power(i,P-2)%P;G.a[i](i1)?(P-ans):ans;}F.nn;G.nmin(k1,n);mul(F,G);for(ll i0;in;i)a[i]F.a[i];return;
}
signed main()
{scanf(%lld%lld%lld,n,m,a[0][0]);for(ll i1;in;i){memset(v,0,sizeof(v));for(ll j0;jm;j)scanf(%lld,a[i][j]);ll z;for(z1;zm;z)if(a[i][z-1])break;ll ka[i][z]*power(a[i][z-1],P-2)%P;Diff(a[i],m,k);for(ll j1;ji;j){bool flag0;for(ll k0;km;k)if(a[i][k]!a[j][k]){flag1;break;}if(!flag){col[i]col[j];num[col[i]];break;}}if(!col[i]){col[i]cnt;num[cnt]1;}}printf(%lld\n,cnt);for(ll i1;icnt;i){printf(%lld\n,num[i]);for(ll j1;jn;j)if(col[j]i)printf(%lld ,j-1);putchar(\n);}return 0;
}