「模拟赛20180307」三元组 exclaim 枚举+树状数组
题目描述
给定 \(n,k\) ,求有多少个三元组 \((a,b,c)\) 满足 \(1≤a≤b≤c≤n\)且\(a + b^2 ≡ c^3\ (mod\ k)\)。
输入
多组数据,第一行数据组数\(T\)。
每组数据两个整数,\(n\)和\(k\)。
输出
\(T\)行,每行一个整数,表示满足条件的三元组的个数。
样例
样例输入
1
10 7
样例输出
27
//为什么老被和谐啊
数据范围
\(1≤n,k≤10^5\)
\(T≤400\)
时间限制\(4s\)
题解
与其他学校互测,然后做题感觉很不友好……
这道题数据很有特点(哪里很有特点了),\(10^5\)显然是一个象征性的数字,它意味着\(O(n\ log\ n)\)是可以过的(这么大的\(T\)被无视了啊)。
那么很自然的想到,这个式子并没有什么规律(我也很无奈啊),我们可以考虑枚举\(a,b,c\)中的\(1\)个。
但是我们选择哪一个比较好呢?容易想到,应该是\(c\),它的次数最高,不易计算。
接下来考虑一个简化的问题,如果不取余\(k\),该怎么办?
对于一个数\(b\),由于\(1≤a≤b\),显然\(c^3\)只有在\([b^2+1,b^2+b]\)范围内才有解,而且是唯一解。
所以每一个\(b\)可以为在\([b^2+1,b^2+b]\)的\(c^3\)提供一个解,这不就是区间增加一个值吗?树状数组即可做到。
再考虑取余\(k\)时,发现情况如出一辙,一样的做就可以了。唯一一个问题就是,\([b^2+1,b^2+b]\)可能长度超过了\(k\)。
这时能发现长度超过\(k\)后完全覆盖了所有区域,任何一个\(c\)都可以使用这个\(b\),我们只需要一个计数器\(count\),每次增加\(\left \lfloor\frac{b}{k}\right \rfloor\)。
现在,这道题的解法就呼之欲出了。我们从小到大枚举\(c\),先在树状数组\((tree)\)中\([c^2+1,c^2+c]\)的区间加上\(1\),并更新\(count\),答案就等于\(tree[c^3\%k]+count\)。时间复杂度为\(O(Tn\ log\ n)\)(再说一次请无视\(T\)的大小)
\(Code:\)
#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);
}
}
最后的吐槽:\(exclaim\)并不是三元组的意思,是惊叫的意思……至于为什么,我也不知道……
「模拟赛20180307」三元组 exclaim 枚举+树状数组的更多相关文章
- 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】
U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...
- 【CSP模拟赛】奇怪的队列(树状数组 &二分&贪心)
题目描述 nodgd的粉丝太多了,每天都会有很多人排队要签名. 今天有n个人排队,每个人的身高都是一个整数,且互不相同.很不巧,nodgd今天去忙别的事情去了,就只好让这些粉丝们明天再来.同时nod ...
- 「模拟赛20180306」回忆树 memory LCA+KMP+AC自动机+树状数组
题目描述 回忆树是一棵树,树边上有小写字母. 一次回忆是这样的:你想起过往,触及心底--唔,不对,我们要说题目. 这题中我们认为回忆是这样的:给定 \(2\) 个点 \(u,v\) (\(u\) 可能 ...
- LG5200 「USACO2019JAN」Sleepy Cow Sorting 树状数组
\(\mathrm{Sleepy Cow Sorting}\) 问题描述 LG5200 题解 树状数组. 设\(c[i]\)代表\([1,i]\)中归位数. 显然最终的目的是将整个序列排序为一个上升序 ...
- UvaLive 6667 Longest Chain (分治求三元组LIS&树状数组)
题目链接: here 题意: 和hdu4742类似.差别就是一部分三元组是直接给出的.另一部分是用他给的那个函数生成的.还有就是这里的大于是严格的大于a>b必须ax>bx,ay>by ...
- LightOJ 1372 (枚举 + 树状数组)
题目 Link 输出序列中有多少个组合 {a1,a2,a3,a4,a5,a6}可以构成一个六边形. 分析 序列每个数都不相等. 所以可以设 a1<a2<a3<a4<a5< ...
- 「模拟赛20190327」 第二题 DP+决策单调性优化
题目描述 小火车虽然很穷,但是他还是得送礼物给妹子,所以他前往了二次元寻找不需要钱的礼物. 小火车准备玩玩二次元的游戏,游戏当然是在一个二维网格中展开的,网格大小是\(n\times m\)的,某些格 ...
- 「模拟赛20181025」御风剑术 博弈论+DP简单优化
题目描述 Yasuo 和Riven对一排\(n\)个假人开始练习.斩杀第\(i\)个假人会得到\(c_i\)个精粹.双方轮流出招,他们在练习中互相学习,所以他们的剑术越来越强.基于对方上一次斩杀的假人 ...
- 「模拟赛20180406」膜树 prufer编码+概率
题目描述 给定一个完全图,保证\(w_{u,v}=w_{v,u}\)且\(w_{u,u}=0\),等概率选取一个随机生成树,对于每一对\((u,v)\),求\(dis(u,v)\)的期望值对\(998 ...
随机推荐
- queryRuner如何获得bean对象,当这个bean对象中包含其他对象的时候
我们知道我们可以使用dbutil的QueryRunner下的query方法使用BeanHandler得到bean对象 但是,当我们在一个表和另一个表关联的时候,往往喜欢将另一个表的关联字段变成另一个b ...
- 【C++ Primer 5th】Chapter 1
1. 每个C++都包含至少一个函数,其中一个必须为main函数,且 main 函数的返回类型必须为 int. 2. 函数定义包括:返回类型,函数名,形参列表,函数体 3. main 函数返回值用来指示 ...
- JS通过经纬度计算两个地方的距离
1 主要原理: Lat1 Lung1 表示A点纬度和经度,Lat2 Lung2 表示B点纬度和经度: a=Lat1 – Lat2 为两点纬度之差 b=Lung1 -Lung2 为两点经度之差: 63 ...
- log4net 使用
1. 代码中使用配置文件: log4net.Config.DOMConfigurator.Configure(new FileInfo("log4netConfig.xml")); ...
- MySQL的分页技术总结
利用子查询示例: SELECT * FROM your_table WHERE id <= (SELECT id FROM your_table ORDER BY id desc LIMIT ( ...
- Poj 2304 Combination Lock(模拟顺、逆时钟开组合锁)
一.题目大意 模拟一个开组合的密码锁过程.就像电影你开保险箱一样,左转几圈右转几圈的就搞定了.这个牌子的锁呢,也有它独特的转法.这个锁呢,有一个转盘,刻度为0~39.在正北方向上有一个刻度指针.它的密 ...
- HDOJ5438(图的各个连通分量遍历)
#include<cstdio> #include<cstring> using namespace std; ; template<class T> struct ...
- mysql命令之一:mysql常用命令之一
一.登录 1.本地登录:MySQL 连接本地数据库,用户名为“root”,密码“123”(注意:“-p”和“123” 之间不能有空格) C:\>mysql -h localhost -u roo ...
- flume入门之一:flume 安装及测试
http://flume.apache.org/ flume下载:http://mirror.bit.edu.cn/apache/flume/1.7.0/apache-flume-1.7.0-bin. ...
- wpf staticresource 是不允许向前引用(forward reference)的
不允许向前引用(forward reference)在C/C++中中很常见,即在语法上,未定义变量.类之前,不能使用. 没想到wpf中的wpf staticresource也遵循这种规则.资源字典中, ...