洛谷 P8152题解

温馨提示: \color{#E74C3C}\text{温馨提示:} 温馨提示:

遇见题解勿抄袭,棕名封号两行泪。 \color{#E74C3C}\text{遇见题解勿抄袭,棕名封号两行泪。} 遇见题解勿抄袭,棕名封号两行泪。

题目传送门

思路

看一下样例解释,我们因此可以发现分割 k k k 次就一共有 k × n × n k \times n \times n k×n×n 个矩形,但是还有 k − 1 k-1 k1 个矩形被重复计算了。

因此推导出:总的矩形数量 = k × n × n − ( k − 1 ) k \times n \times n-(k-1) k×n×n(k1)

注意: 因为数据过大, 1 ≤ n , k ≤ 1 0 9 1≤n , k≤10^9 1n,k109 , 所以我们计算一步,就要对 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(k1) 出了问题: s u m sum sum 已经对 N N N 求余了,所以 k − 1 k-1 k1 可能已经比 s u m sum sum 大了,因此 k − 1 k-1 k1 也要对 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 

感谢资瓷

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值