QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#645353#5442. Referee Without RedWuyanruWA 192ms159384kbC++144.9kb2024-10-16 17:54:292024-10-16 17:54:30

Judging History

你现在查看的是最新测评结果

  • [2024-10-16 17:54:30]
  • 评测
  • 测评结果:WA
  • 用时:192ms
  • 内存:159384kb
  • [2024-10-16 17:54:29]
  • 提交

answer

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f3f3f3f3fll
#define debug(x) cerr<<#x<<"="<<x<<endl
using namespace std;
using ll=long long;
using ld=long double;
using pli=pair<ll,int>;
using pi=pair<int,int>;
template<typename A>
using vc=vector<A>;
inline int read()
{
    int s=0,w=1;char ch;
    while((ch=getchar())>'9'||ch<'0') if(ch=='-') w=-1;
    while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
    return s*w;
}
inline ll lread()
{
    ll s=0,w=1;char ch;
    while((ch=getchar())>'9'||ch<'0') if(ch=='-') w=-1;
    while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
    return s*w;
}
const int mod=998244353;
bool vis1[1000005];
bool vis2[1000005];
ll jc[3000005];
ll inv[3000005];
int pri[3000005];
int is[3000005];
int wtf[3000005];
int fa[2000005];
vc<int>a[1000005];
vc<int>w1[1000005];
vc<int>w2[1000005];
bool v[1000005];
int p[1000005];
int s[1000005];
int nx[1000005];
int n,m,c1,c2;
vc<int>now;
inline ll qow(ll a,ll b)
{
    ll ans=1;
    while(b)
    {
        if(b&1) ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans;
}
inline void init(int L)
{
    for(int i=2;i<=L;i++)
    {
        if(!is[i]) pri[++pri[0]]=i;
        for(int j=1;j<=pri[0]&&i*pri[j]<=L;j++)
        {
            is[i*pri[j]]=1;
            if(i%pri[j]==0) break;
        }
    }
    for(int i=1;i<=pri[0];i++)
    {
        ll now=pri[i];
        while(now<=L) wtf[now]=pri[i],now*=pri[i];
    }
    memset(is,0,sizeof(is));

    jc[0]=1;
    for(int i=1;i<=L;i++) jc[i]=jc[i-1]*i%mod;
    inv[L]=qow(jc[L],mod-2);
    for(int i=L;i;i--) inv[i-1]=inv[i]*i%mod;
    for(int i=1;i<=L;i++) inv[i]=jc[i-1]*inv[i]%mod;
}
inline int run(int len)
{
    for(int i=2,j=0;i<=len;i++)
    {
        while(j&&s[j+1]!=s[i]) j=nx[j];
        if(s[j+1]==s[i]) j++;
        nx[i]=j;
    }
    int ans=len;
    while(nx[len])
    {
        if(len%(len-nx[len])==0) ans=min(ans,len-nx[len]);
        nx[len]=nx[nx[len]];
    }
    return ans;
}
inline ll push(int v)
{
    ll ans=1;
    for(int i=1;i<=v;i++) if(v%i==0&&wtf[i]&&!is[i])
    {
        ans=ans*wtf[i]%mod,is[i]=1;
        now.push_back(i);
    }
    return ans;
}
inline void clear()
{
    for(int i:now) is[i]=0;
    now.clear();
}
inline int find(int num)
{
    if(fa[num]==num) return num;
    return fa[num]=find(fa[num]);
}
inline ll get(int x,int y,bool &f)
{
    f=0;ll ans=1;int cnt=0;
    for(int i:w1[x]) for(int j:w2[y])
    {
        cnt++,ans=ans*cnt%mod;
        if(is[a[i][j]]) f=1;
        is[a[i][j]]++,ans=ans*inv[is[a[i][j]]]%mod;
    }
    for(int i:w1[x]) for(int j:w2[y]) is[a[i][j]]=0;
    return ans;
}
int main()
{
    int T=read();init(1000000);
    while(T--)
    {
        n=read(),m=read(),c1=c2=0;
        for(int i=1;i<=n;i++)
        {
            a[i].resize(m+1);
            for(int j=1;j<=m;j++) a[i][j]=read();
        }
        for(int i=1;i<=n;i++) p[i]=(i&1)?(i/2+1):((n+i+1)/2),v[i]=0;
        for(int i=1;i<=n;i++) if(!v[i])
        {
            c1++;w1[c1].clear();vis1[c1]=0;
            for(int j=i;!v[j];j=p[j]) w1[c1].push_back(j),v[j]=1;
        }
        for(int i=1;i<=m;i++) p[i]=(i&1)?(i/2+1):((m+i+1)/2),v[i]=0;
        for(int i=1;i<=m;i++) if(!v[i])
        {
            c2++;w2[c2].clear();vis2[c2]=0;
            for(int j=i;!v[j];j=p[j]) w2[c2].push_back(j),v[j]=1;
        }

        for(int i=1;i<=c1+c2;i++) fa[i]=i;

        ll ans=1;
        for(int i=1;i<=c1;i++) if(w1[i].size()==1)
        {
            for(int j=1;j<=c2;j++)
            {
                int len=0;
                for(int p:w2[j]) s[++len]=a[w1[i][0]][p];
                ans=ans*push(run(len))%mod;
            }
            clear();
        }
        for(int i=1;i<=c2;i++) if(w2[i].size()==1)
        {
            for(int j=1;j<=c1;j++)
            {
                int len=0;
                for(int p:w1[j]) s[++len]=a[p][w2[i][0]];
                ans=ans*push(run(len))%mod;
            }
            clear();
        }
        for(int i=1;i<=c1;i++) for(int j=1;j<=c2;j++)
        {
            if(w1[i].size()==1||w2[j].size()==1) continue;
            bool f;ll val=get(i,j,f);
            if(f) ans=ans*val%mod;
            else
            {
                ans=ans*val%mod*inv[2]%mod;
                if(w1[i].size()%2==0&&w2[j].size()%2==0)
                {
                    int u=find(i),v=find(c1+j);
                    if(u!=v) ans=ans*2%mod,fa[u]=v;
                }
                else if(w1[i].size()%2==0)
                {
                    if(!vis2[j]) vis2[j]=1,ans=ans*2%mod;
                }
                else if(w2[j].size()%2==0)
                {
                    if(!vis1[i]) vis1[i]=1,ans=ans*2%mod;
                }
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}
/*
1
7 4
12  8 10 12
 7 11 10  9
 2  6  9  8
12  6  9 12
11  7 12  2
 6  7  3 11
 3 12 10  2
*/

详细

Test #1:

score: 100
Accepted
time: 22ms
memory: 122372kb

input:

2
4 4
1 2 3 4
3 4 1 2
1 2 4 1
4 3 3 2
3 9
1 8 1 1 8 1 1 8 1
1 8 8 8 8 8 8 8 1
1 1 1 8 8 8 1 1 1

output:

96
6336

result:

ok 2 number(s): "96 6336"

Test #2:

score: 0
Accepted
time: 23ms
memory: 120320kb

input:

1
18 16
8 8 1 1 8 8 8 1 8 8 8 1 8 8 8 1
8 1 8 1 8 1 1 1 8 1 1 1 8 1 1 1
8 8 8 1 8 8 8 1 8 8 8 1 8 8 8 1
8 8 1 1 8 1 1 1 8 1 1 1 8 1 1 1
8 1 8 1 8 8 8 1 8 1 1 1 8 8 8 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
8 8 1 1 8 8 8 1 8 8 8 1 7 7 7 1
8 1 8 1 8 1 1 1 8 1 1 1 1 1 7 1
8 8 8 1 8 8 8 1 8 8 8 1 1 7 7 1
8 8 ...

output:

690561281

result:

ok 1 number(s): "690561281"

Test #3:

score: 0
Accepted
time: 142ms
memory: 122264kb

input:

71117
7 8
2868391 1228870 2892937 349733 664891 1675356 1981526 762573
2892937 2892937 664891 1228870 959280 762573 664891 959280
349733 250147 1675356 349733 349733 762573 1675356 250147
1675356 959280 664891 250147 250147 250147 2868391 959280
1675356 664891 250147 1228870 1981526 250147 2868391 2...

output:

462363428
38853786
194740086
215040
40320
322560
32456681
1166400
887214222
542386470
375765881
9
4
361590980
913481201
527607149
85428015
311271219
16
645120
557106771
388800
173057174
232068778
460990604
1
239327783
9
145293043
40098691
97370043
799392782
155415144
1
36
3991680
645120
545661527
55...

result:

ok 71117 numbers

Test #4:

score: 0
Accepted
time: 103ms
memory: 120292kb

input:

755
63 63
2320566 2175957 1897863 2154093 2551257 1353847 334243 2310922 489697 2025148 2898381 1301433 2025918 2624822 916273 446350 489697 1834347 1618696 1170954 1947467 565649 1188980 818151 2167497 604100 933579 1526487 727797 1757541 6096 437958 328396 1130316 1468846 836834 1116369 1764066 23...

output:

287964952
603855872
35995619
2358812
337581814
287964952
287964952
287964952
287964952
779896829
287964952
287964952
287964952
585654112
866781526
35995619
143982476
287964952
287964952
35995619
287964952
287964952
287964952
287964952
287964952
545250000
287964952
71991238
356745197
143982476
287964...

result:

ok 755 numbers

Test #5:

score: 0
Accepted
time: 123ms
memory: 130240kb

input:

3734
20000 67
1389602 980790 2386085 1588484 2146516 1958159 642773 1716215 8079 1390992 1759761 2249217 765459 1929585 2118921 2105012 772668 984626 547175 1431565 170214 158951 1747481 720208 2833374 1145557 935993 2380503 1866168 1786126 914416 226298 685975 2045140 2995280 2664012 2149948 123450...

output:

197365516
551326836
561392495
934386097
831902835
368564644
820576782
135908312
28978034
857802169
412595593
897725368
453922016
594795473
32568607
686163581
643980228
577320582
468537842
208135614
183185490
599452355
234405712
915650810
325429822
215832653
635537720
642480236
699742763
948160486
36...

result:

ok 3734 numbers

Test #6:

score: 0
Accepted
time: 65ms
memory: 120264kb

input:

100000
2 5
2821965 2145474 853310 2911664 2627670
675327 2311210 1625221 1157380 781808
2 5
1679375 1167880 1289337 64420 2022177
774138 352469 1425384 1116876 193830
2 5
639747 904150 1513642 308309 914801
572251 2736819 303116 1418330 487350
2 5
2319520 900918 2481864 2800242 2869240
675529 501477...

output:

16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
...

result:

ok 100000 numbers

Test #7:

score: 0
Accepted
time: 192ms
memory: 159384kb

input:

1
1000000 3
3000000 3000000 3000000
3000000 3000000 3000000
3000000 3000000 3000000
3000000 3000000 3000000
3000000 3000000 3000000
3000000 3000000 3000000
3000000 3000000 3000000
3000000 3000000 3000000
3000000 3000000 3000000
3000000 3000000 3000000
3000000 3000000 3000000
3000000 3000000 3000000
...

output:

1

result:

ok 1 number(s): "1"

Test #8:

score: -100
Wrong Answer
time: 110ms
memory: 134132kb

input:

1
1019 2939
3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 3000000 ...

output:

0

result:

wrong answer 1st numbers differ - expected: '1', found: '0'