题目描述

给定 \(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 枚举+树状数组的更多相关文章

  1. 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】

    U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...

  2. 【CSP模拟赛】奇怪的队列(树状数组 &二分&贪心)

    题目描述 nodgd的粉丝太多了,每天都会有很多人排队要签名.  今天有n个人排队,每个人的身高都是一个整数,且互不相同.很不巧,nodgd今天去忙别的事情去了,就只好让这些粉丝们明天再来.同时nod ...

  3. 「模拟赛20180306」回忆树 memory LCA+KMP+AC自动机+树状数组

    题目描述 回忆树是一棵树,树边上有小写字母. 一次回忆是这样的:你想起过往,触及心底--唔,不对,我们要说题目. 这题中我们认为回忆是这样的:给定 \(2\) 个点 \(u,v\) (\(u\) 可能 ...

  4. LG5200 「USACO2019JAN」Sleepy Cow Sorting 树状数组

    \(\mathrm{Sleepy Cow Sorting}\) 问题描述 LG5200 题解 树状数组. 设\(c[i]\)代表\([1,i]\)中归位数. 显然最终的目的是将整个序列排序为一个上升序 ...

  5. UvaLive 6667 Longest Chain (分治求三元组LIS&amp;树状数组)

    题目链接: here 题意: 和hdu4742类似.差别就是一部分三元组是直接给出的.另一部分是用他给的那个函数生成的.还有就是这里的大于是严格的大于a>b必须ax>bx,ay>by ...

  6. LightOJ 1372 (枚举 + 树状数组)

    题目 Link 输出序列中有多少个组合 {a1,a2,a3,a4,a5,a6}可以构成一个六边形. 分析 序列每个数都不相等. 所以可以设 a1<a2<a3<a4<a5< ...

  7. 「模拟赛20190327」 第二题 DP+决策单调性优化

    题目描述 小火车虽然很穷,但是他还是得送礼物给妹子,所以他前往了二次元寻找不需要钱的礼物. 小火车准备玩玩二次元的游戏,游戏当然是在一个二维网格中展开的,网格大小是\(n\times m\)的,某些格 ...

  8. 「模拟赛20181025」御风剑术 博弈论+DP简单优化

    题目描述 Yasuo 和Riven对一排\(n\)个假人开始练习.斩杀第\(i\)个假人会得到\(c_i\)个精粹.双方轮流出招,他们在练习中互相学习,所以他们的剑术越来越强.基于对方上一次斩杀的假人 ...

  9. 「模拟赛20180406」膜树 prufer编码+概率

    题目描述 给定一个完全图,保证\(w_{u,v}=w_{v,u}\)且\(w_{u,u}=0\),等概率选取一个随机生成树,对于每一对\((u,v)\),求\(dis(u,v)\)的期望值对\(998 ...

随机推荐

  1. 第一章 走进Python

    目标 了解Python的历史 了解Python的特征 了解Python的应用 掌握Linux下Python开发环境的搭建 理解Windows下Python环境搭建 案例 安装Python,写出第一个P ...

  2. html5 tab横向滚动,无滚动条(transform:translate)

    html5 横向滚动,用到了 touchstart.touchmove.touchend 控制修改transform:translate属性;[手机端或者浏览器模拟手机模式才有效果] [转载请注明出处 ...

  3. error: ‘errno’ was not declared in this scope

    问题: 将一个c文件改为cpp文件,其中的perror()改用C++中的std::cerr << strerror(error) << std::endl;来替换. 重新编译文 ...

  4. 无旋Treap - BZOJ1014火星人 & 可持久化版文艺平衡树

    !前置技能&概念! 二叉搜索树 一棵二叉树,对于任意子树,满足左子树中的任意节点对应元素小于根的对应元素,右子树中的任意节点对应元素大于根对应元素.换言之,就是满足中序遍历为依次访问节点对应元 ...

  5. linux 在后台运行数据库导入导出命令

    nohup imp dbusername/password@orcl file=/home/20170928.dmp ignore=y log=/home/oracle/20170928.log fu ...

  6. bzoj 2002: 弹飞绵羊 Link-Cut-Tree

    题目: Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置, ...

  7. 标准模板库(STL)学习指南之priority_queue优先队列

    转载自CSDN博客:http://blog.csdn.net/suwei19870312/article/details/5294016 priority_queue 调用 STL里面的 make_h ...

  8. jraiser小结

    1 合并小结 jrcpl F:\site\js\app --settings package.settings 上面代码的意思,就是说,根据package.settings文件,来对app文件夹下的所 ...

  9. easy_install下载地址及安装

    下载地址 https://pypi.python.org/pypi/setuptools 解压 tar -xzvf xx.tar.gz 安装 cd 解压目录 sudo python setup.py ...

  10. androidpn环境搭建

    1.下载androidpn版本.http://sourceforge.net/projects/androidpn/postdownload?source=dlp 2.下载安装tomcat 2.1 下 ...