牛客挑战赛53G-同源数组(Easy Version)【NTT】
正題
題目鏈接:https://ac.nowcoder.com/acm/contest/11193/G
題目大意
給出nnn個(gè)長(zhǎng)度為mmm的數(shù)組,然后你每次可以進(jìn)行差分(不會(huì)改變數(shù)組長(zhǎng)度那種)和前綴和。
如果兩個(gè)數(shù)組可以在模998244353998244353998244353意義下操作成同一個(gè)數(shù)組,那么這兩個(gè)同源,求所有的同源數(shù)組。
1≤n≤100,1≤m≤10001\leq n\leq 100,1\leq m\leq 10001≤n≤100,1≤m≤1000
解題思路
考慮將所有同源的操作成同一種形式。
注意到對(duì)于差分來(lái)說(shuō)數(shù)組的第一個(gè)位置是保持不變的,更具體地說(shuō),其實(shí)是數(shù)組中從前往后第一個(gè)不是000的數(shù)字是不會(huì)變的。
設(shè)為aka_kak?,然后此時(shí)每次差分都會(huì)令ak+1=ak+1?aka_{k+1}=a_{k+1}-a_kak+1?=ak+1??ak?。首先對(duì)于兩個(gè)數(shù)組來(lái)說(shuō)肯定得有k=k′k=k'k=k′且ak=ak′′a_{k}=a'_{k'}ak?=ak′′?,然后再考慮后面的。
為了方便比較我們之間讓ak+1a_{k+1}ak+1?一直差分直到其等于000,此時(shí)我們就可以直接拿兩個(gè)數(shù)組比較了。
快速處理kkk階差分的做法就直接上NTTNTTNTT乘上一個(gè)(1?x)k(1-x)^k(1?x)k(二項(xiàng)式展開(kāi))就好了
時(shí)間復(fù)雜度:O(nmlog?m)O(nm\log m)O(nmlogm)
Hard Version要任意模加Lucas先潤(rùn)了
code
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long #define ull unsigned long long using namespace std; const ll N=4e3+10,P=998244353; 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 ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans; } void NTT(ll *f,ll n,ll op){for(ll i=0;i<n;i++)if(i<r[i])swap(f[i],f[r[i]]);for(ll p=2;p<=n;p<<=1){ll len=p>>1,tmp=power(3,(P-1)/p);if(op==-1)tmp=power(tmp,P-2);for(ll k=0;k<n;k+=p){ll buf=1;for(ll i=k;i<k+len;i++){ll tt=f[i+len]*buf%P;f[i+len]=(f[i]-tt+P)%P;f[i]=(f[i]+tt)%P;buf=buf*tmp%P;}}}if(op==-1){ll invn=power(n,P-2);for(ll i=0;i<n;i++)f[i]=f[i]*invn%P;}return; } void mul(poly &a,poly &b){ll n=1;while(n<=a.n+b.n)n<<=1;for(ll i=0;i<n;i++)r[i]=(r[i>>1]>>1)|((i&1)?(n>>1):0);NTT(a.a,n,1);NTT(b.a,n,1);for(ll i=0;i<n;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 i=0;i<n;i++)F.a[i]=a[i];for(ll i=0,ans=1;i<=min(k,n-1);i++){if(i)ans=ans*(k-i+1)%P*power(i,P-2)%P;G.a[i]=(i&1)?(P-ans):ans;}F.n=n;G.n=min(k+1,n);mul(F,G);for(ll i=0;i<n;i++)a[i]=F.a[i];return; } signed main() {scanf("%lld%lld%lld",&n,&m,&a[0][0]);for(ll i=1;i<=n;i++){memset(v,0,sizeof(v));for(ll j=0;j<m;j++)scanf("%lld",&a[i][j]);ll z;for(z=1;z<m;z++)if(a[i][z-1])break;ll k=a[i][z]*power(a[i][z-1],P-2)%P;Diff(a[i],m,k);for(ll j=1;j<i;j++){bool flag=0;for(ll k=0;k<m;k++)if(a[i][k]!=a[j][k]){flag=1;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 i=1;i<=cnt;i++){printf("%lld\n",num[i]);for(ll j=1;j<=n;j++)if(col[j]==i)printf("%lld ",j-1);putchar('\n');}return 0; }總結(jié)
以上是生活随笔為你收集整理的牛客挑战赛53G-同源数组(Easy Version)【NTT】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: maya电脑配置要求(maya 电脑配置
- 下一篇: 配置游戏电脑清单在哪(配置游戏电脑清单)