温馨提示: \color{#E74C3C}\text{温馨提示:} 温馨提示:
遇见题解勿抄袭,棕名封号两行泪。 \color{#E74C3C}\text{遇见题解勿抄袭,棕名封号两行泪。} 遇见题解勿抄袭,棕名封号两行泪。
思路
看一下样例解释,我们因此可以发现分割 k k k 次就一共有 k × n × n k \times n \times n k×n×n 个矩形,但是还有 k − 1 k-1 k−1 个矩形被重复计算了。
因此推导出:总的矩形数量 = k × n × n − ( k − 1 ) k \times n \times n-(k-1) k×n×n−(k−1)
注意: 因为数据过大,
1
≤
n
,
k
≤
1
0
9
1≤n , k≤10^9
1≤n,k≤109 , 所以我们计算一步,就要对
998244353
998244353
998244353 (下面简称
N
N
N) 取余一次。但是不用担心,本人亲测,不用开__int128
因此代码如下:
Coding time
#include <bits/stdc++.h>
using namespace std;
unsigned long long N = 998244353;
int main()
{
unsigned long long n,k;
unsigned long long sum;
cin>>n>>k;
sum=(k%N*(n%N))%N;
sum=(sum%N*(n%N))%N;
sum=sum-(k-1);
sum=sum%N;
cout<<sum<<endl;
return 0;
}
可惜发现WA了第十个点,只得到
90
90
90 分。
原来是因为 s u m = s u m − ( k − 1 ) sum=sum-(k-1) sum=sum−(k−1) 出了问题: s u m sum sum 已经对 N N N 求余了,所以 k − 1 k-1 k−1 可能已经比 s u m sum sum 大了,因此 k − 1 k-1 k−1 也要对 N N N 求余。
Coding time \text{Coding time} Coding time
#include <bits/stdc++.h>
using namespace std;
unsigned long long N = 998244353;
int main()
{
unsigned long long n,k;
unsigned long long sum;
cin>>n>>k;
sum=(k%N*(n%N))%N;
sum=(sum%N*(n%N))%N;
sum=sum-((k-1)%N);\\改了这儿
sum=sum%N;
cout<<sum<<endl;
return 1;
}
Update: 2022.7.14
\text{Update: 2022.7.14}
Update: 2022.7.14
中午交了一下这道题目,发现是
90
90
90 分
结果才发现
7.10
7.10
7.10 出了一组 HACK 数据,下面放上 AC 代码 (注意要加上 __int128
,快读,快输):
#include<bits/stdc++.h>
using namespace std;
__int128 n,k;
#define gc getchar()
const int mod=998244353;
__int128 read()
{
int x=0;
bool sgn=0;
char s=gc;
while(!isdigit(s))sgn|=s=='-',s=gc;
while(isdigit(s))x=(x<<1)+(x<<3)+(s-'0'),s=gc;
return sgn?-x:x;
}
void write(__int128 x)
{
if(x<0)putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return ;
}
int main()
{
n=read(),k=read();
write((n*n*k-k+1)%mod);
return 0;
}
这次是真的可以 AC 了
The End
\text{The End }
The End
感谢资瓷