「模拟赛20180307」三元组 exclaim 枚举+树状数组
题目描述
给定 ,求有多少个三元组 满足 且。
输入
多组数据,第一行数据组数。
每组数据两个整数,和。
输出
行,每行一个整数,表示满足条件的三元组的个数。
样例
样例输入
1
10 7
样例输出
27
//为什么老被和谐啊
数据范围
时间限制
题解
与其他学校互测,然后做题感觉很不友好……
这道题数据很有特点(哪里很有特点了),显然是一个象征性的数字,它意味着是可以过的(这么大的被无视了啊)。
那么很自然的想到,这个式子并没有什么规律(我也很无奈啊),我们可以考虑枚举中的个。
但是我们选择哪一个比较好呢?容易想到,应该是,它的次数最高,不易计算。
接下来考虑一个简化的问题,如果不取余,该怎么办?
对于一个数,由于,显然只有在范围内才有解,而且是唯一解。
所以每一个可以为在的提供一个解,这不就是区间增加一个值吗?树状数组即可做到。
再考虑取余时,发现情况如出一辙,一样的做就可以了。唯一一个问题就是,可能长度超过了。
这时能发现长度超过后完全覆盖了所有区域,任何一个都可以使用这个,我们只需要一个计数器,每次增加。
现在,这道题的解法就呼之欲出了。我们从小到大枚举,先在树状数组中的区间加上,并更新,答案就等于。时间复杂度为(再说一次请无视的大小)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 100005
#define ll long long
int T, n, mod;
ll ans, now, t[N];
void update(int x, int v)
{
for (int i = x; i <= mod; i += i & -i)
t[i] += v;
}
ll getsum(int x)
{
ll ans = 0;
for (int i = x; i; i -= i & -i)
ans += t[i];
return ans;
}
int main()
{
freopen("exclaim.in", "r", stdin);
freopen("exclaim.out", "w", stdout);
scanf("%d", &T);
for (int cas = 1; cas <= T; cas++)
{
scanf("%d%d", &n, &mod);
ans = now = 0;
memset(t, 0, sizeof(t));
for (int i = 1; i <= n; i++)
{
int l =(1ll * i * i + 1)% mod + 1, r =(1ll * i * i + i)% mod + 1;
if (l <= r)
update(l, 1), update(r + 1, -1);
else
update(1, 1), update(r + 1, -1), update(l, 1);
int c = 1ll * i * i % mod * i % mod;
now +=(i - 1)/ mod;
ans += getsum(c + 1) + now;
}
printf("Case %d: ", cas);
cout << ans;
putchar(10);
}
}
最后的吐槽:并不是三元组的意思,是惊叫的意思……至于为什么,我也不知道……
作者:ModestStarlight
出处:http://www.cnblogs.com/ModestStarlight/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
分类:
数据结构 - 一般树状数组
, 其他 - 枚举
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现