QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#575056 | #1465. Not Our Problem | sslwcr | WA | 1ms | 9724kb | C++14 | 2.3kb | 2024-09-19 10:15:02 | 2024-09-19 10:15:03 |
Judging History
answer
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<bits/stdc++.h>
#define int long long
#define mod 998244353
using namespace std;
inline int read()
{
char c=getchar();
int ans=0,fl=1;
while ((c>'9'||c<'0')&&c!='-') c=getchar();
if (c=='-')
{
fl=-1;
}
else ans=c-'0';
c=getchar();
while (c<='9'&&c>='0')
{
ans=ans*10+c-'0';
c=getchar();
}
return ans*fl;
}
int n,k,a[500005],mx[500005],b[500005],sq;
int gt(int v)
{
if (v==0) return 4e18;
if (k/v/v>=v) return k/v/v;
return sqrt(k)/sqrt(v);
}
int s[1000006],f[1000006];
signed main()
{
n=read(),k=read();
sq=1;
while ((sq+1)*(sq+1)*(sq+1)<=k) sq++;
for (int i=1;i<=n;i++)
{
a[i]=read();
b[i]=a[i];
if (b[i]==-1) b[i]=0;
}
if (n==1&&a[1]==-1)
{
cout<<-1;
return 0;
}
if (n==1)
{
cout<<1;
return 0;
}
int ans=1;
for (int i=1;i<n;i++)
{
if (a[i]!=-1&&a[i+1]!=-1)
{
if (1.*a[i]*a[i+1]*min(a[i],a[i+1])>1e18)
{
printf("0");
return 0;
}
if (k<a[i]*a[i+1]*min(a[i],a[i+1]))
{
printf("0");
return 0;
}
continue;
}
}
for (int i=1;i<=n;i++)
{
if (a[i]==-1&&!b[i-1]&&!b[i+1])
{
printf("-1");
return 0;
}
}
for (int i=1;i<=sq;i++)
{
int y=k/(1LL*i*i);
s[i]=(s[i-1]+(y-sq))%mod;
f[sq-i+1]=y;
}
for (int i=1;i<=n;i++)
{
if (a[i]!=-1)
{
continue;
}
if (a[i-1]!=-1&&a[i+1]!=-1)
{
int v=b[i-1];
mx[i]=gt(v);
v=b[i+1];
mx[i]=min(gt(v),mx[i]);
ans=ans*(1+mx[i])%998244353ll;
continue;
}
int A=gt(a[i-1]),B=gt(a[i+2]);
int tmp=0;
if (A>sq&&B>sq)
{
int id=sq+1-(lower_bound(f+1,f+1+sq,A)-f);
tmp=(tmp+s[sq]-s[id]+mod+id*(A%mod-sq+mod)%mod)%mod;
tmp=(tmp+sq*sq%mod)%mod;
id=sq+1-(lower_bound(f+1,f+1+sq,B)-f);
tmp=(tmp+s[sq]-s[id]+mod+id*(B%mod-sq+mod)%mod)%mod;
tmp=(tmp+sq*sq%mod)%mod;
tmp=(tmp+A+B+1)%mod;
}
else if (A<=sq&&B<=sq)
{
tmp=(1+A)*(1+B)%mod;
}
else
{
if (A>B) swap(A,B);
int id=sq+1-(lower_bound(f+1,f+1+sq,A)-f);
if(id>A)
{
tmp=(A%mod+1)*(B%mod+1)%mod;
}
else
{
tmp=(s[A]-s[id]+mod)%mod;
tmp=(tmp+(id+1)*(B%mod+1)%mod)%mod;
tmp=(tmp+(A-id)*(sq+1)%mod)%mod;
}
}
ans=ans*tmp%mod;
i++;
continue;
}
cout<<ans;
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 9724kb
input:
4 100 -1 7 2 -1
output:
104
result:
ok 1 number(s): "104"
Test #2:
score: -100
Wrong Answer
time: 1ms
memory: 7748kb
input:
4 100 10 -1 -1 1
output:
404
result:
wrong answer 1st numbers differ - expected: '240', found: '404'