「模拟赛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 ...
随机推荐
- MySQL--Basic(二)
USE db_name; CREATE DATABASE school; Use school; CREATE TABLE `StuInfo` ( `STU_ID` ) NOT NULL , `STU ...
- 2018.6.21 HOLTEK HT49R70A-1 Source Code analysis
Cange note: “Reading TMR1H will latch the contents of TMR1H and TMR1L counter to the destination”? F ...
- OpenAL播放pcm或wav数据流-windows/ios/android(一)
OpenAL播放pcm或wav数据流-windows/iOS/Android(一) 最近在研究渲染问题,本文采用openal做pcm和wav数据流播放,并非本地文件,demo是windows的,i ...
- 线段树Final版本
结构体是个好东西... 看着逼格很高 #include<iostream> #include<cstdio> #include<cstdlib> #include& ...
- Linux环境下,开启tomcat时报transport error 202: bind failed: 地址已在使用
转载自:http://blog.csdn.net/mooncom/article/details/61913813 问题描述:今天我在Linux环境下配置tomcat,在tomcat/conf下的se ...
- ZOJ1610(经典线段树涂色问题)
Description Painting some colored segments on a line, some previously painted segments may be covere ...
- 九 fork/join CompletableFuture
1: Fork/join fork/join: fork是分叉的意思, join是合并的意思. Fork/Join框架:是JAVA7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务 ...
- linux日常管理-查看系统负载
查看系统的负载常用命令w 16:32::15是系统时间 up 16 min 是开机使用时间 1 user 是登录的用户数 重要 load average:0.00 0.00 0.00 负载分别表示1分 ...
- 设置win7资源管理器启动时的默认位置-windows-操作系统-网页教学网
设置win7资源管理器启动时的默认位置-windows-操作系统-网页教学网 如何设置win7资源管理器启动时的默认位置?我不太习惯 Win 7 的资源管理器默认总是打开库,我还是喜欢资源管理器打开树 ...
- BluetoothFindFirstRadio 函数
HBLUETOOTH_RADIO_FIND BluetoothFindFirstRadio( BLUETOOTH_FIND_RADIO_PARAMS* pbtfrp, HANDLE* phRadio ...