飞(fly)(数学推导,liu_runda的神题)
大概看了两三个小时的题解,思考量很大,实现简单........
20分:
明显看出,每个点的贡献是x*(x-1)/2;即组合数C(x,2),从x个线段中选出2个的方案数,显然每次相交贡献为1,n^2枚举相交即可....
40分:
对于四十分,观察图像发现是实际就是求逆序对.....
- 1 #include<iostream>
- 2 #include<cstdio>
- 3 #include<cmath>
- 4 #include<cstring>
- 5 #include<algorithm>
- 6 #include<set>
- 7 #include<map>
- 8 #include<queue>
- 9 #define int long long
- 10 #define MAXN 101001
- 11 using namespace std;
- 12 struct node{int x,id;}e[MAXN];
- 13 int c[MAXN];int N,A,MOD;
- 14 int lowbit(int x){return x&(-x);}
- 15 void add(int x)
- 16 {
- 17 for(int i=x;i<=N;i+=lowbit(i))
- 18 {
- 19 c[i]++;
- 20 }
- 21 }
- 22 int find(int x)
- 23 {
- 24 int ans=0;
- 25 for(int i=x;i>=1;i-=lowbit(i))
- 26 {
- 27 ans+=c[i];
- 28 }
- 29 return ans;
- 30 }
- 31 bool cmp(node a,node b)
- 32 {
- 33 return (a.x!=b.x)?a.x<b.x:a.id<b.id;
- 34 }
- 35 signed main()
- 36 {
- 37 scanf("%lld%lld%lld%lld",&N,&e[1].x,&A,&MOD);e[1].id=1;
- 38 for(int i=2;i<=N;++i)
- 39 {
- 40 e[i].x=(e[i-1].x+A)%MOD;
- 41 e[i].id=i;
- 42 }
- 43 for(int i=1;i<=N;++i)e[i].x++;
- 44 sort(e+1,e+N+1,cmp);
- 45 int anss=0;
- 46 for(int i=1;i<=N;++i)
- 47 {
- 48 anss+=find(N)-find(e[i].id);
- 49 //printf("i=%lld id=%lld anss=%lld\n",i,e[i].id,anss);
- 50 add(e[i].id);
- 51 }
- 52 printf("%lld\n",anss);
- 53 }
40分
部分分:
考虑a==x[1]
我们发现图像的一些性质
在x[i]的不断后移中,假设当x[j]时>MOD,
我们发现x[i]-x[j]是一段以a为公差的序列
为了避免枚举n,我们从a入手
因为公差的原因,将序列分成若干个长度为a的段,其实每次经过的点都是一定的
当x<a时
我们直接求解 此时的ans=(i-1)-ask(now)now为当前值,非常明显,因为i-1是所有在它之前出现的数,ask(now)为不符合的....
之后
发现一个小性质,每次后移减少的值是一定的,即ask(a)
然后递推....
100 分:
在上述部分加入x[1]>a的情况
因为每次减的都是ask(a),但这是第一段在1-a中不存在,我们若是按上述方法求,在枚举中不会将
第一段不符合的值减去,那么......我们发现当枚举第二段时(一段就是长度大于mod后重新开始)
当此时长度now大于初始值时,需要减去1,因为这个1无法在ask(1)中得出啦啦啦....
- 1 #include<iostream>
- 2 #include<cstdio>
- 3 #include<cmath>
- 4 #include<cstring>
- 5 #include<algorithm>
- 6 #include<set>
- 7 #include<map>
- 8 #include<queue>
- 9 #define int long long
- 10 #define MAXN 101001
- 11 using namespace std;
- 12 int x;
- 13 int c[MAXN];int N,A,MOD;
- 14 int lowbit(int x){return x&(-x);}
- 15 void add(int x)
- 16 {
- 17 for(int i=x;i<=A+1;i+=lowbit(i))
- 18 {
- 19 c[i]++;
- 20 }
- 21 }
- 22 int find(int x)
- 23 {
- 24 int ans=0;
- 25 for(int i=x;i>=1;i-=lowbit(i))
- 26 {
- 27 ans+=c[i];
- 28 }
- 29 return ans;
- 30 }
- 31 signed main()
- 32 {
- 33 scanf("%lld%lld%lld%lld",&N,&x,&A,&MOD);
- 34 int anss=0;
- 35 int last=x;
- 36 int now=(x+A)%MOD;
- 37 int cas=0;
- 38 int now_fir=x;//printf("now_fir=%lld\n",now_fir);
- 39 int k=0;
- 40 for(int i=2;i<=N;++i)
- 41 {
- 42 //printf("i=%lld now=%lld last=%lld\n",i,now,last);
- 43 if(now<A)
- 44 {
- 45 if(now_fir<=A)
- 46 {
- 47 add(now_fir+1);
- 48 }
- 49 now_fir=now;
- 50 k++;
- 51 // printf("add last=%lld %lld\n",i,now_fir);
- 52 anss+=(i-1)-find(now+1);
- 53 cas=(i-1)-find(now+1);
- 54 }
- 55 else
- 56 {
- 57 cas-=find(A+1);
- 58 if(now>=x&&x>A&&k>=1)cas--;
- 59 anss+=cas;
- 60 }
- 61 //printf("anss=%lld\n",anss);
- 62 last=now;
- 63 now=(now+A)%MOD;
- 64 }
- 65 printf("%lld\n",anss);
- 66 }
飞(fly)(数学推导,liu_runda的神题)的更多相关文章
- 【BZOJ4173】数学 欧拉函数神题
[BZOJ4173]数学 Description Input 输入文件的第一行输入两个正整数 . Output 如题 Sample Input 5 6 Sample Output 240 HINT N ...
- 【模拟7.27】题(liu_runda的神题)(卡特兰数,组合数)
考场的SB经验不再分享 case 0: 一道组合计数的水题,具体不再讲可以看以前的相似题 case 1: 很明显的卡特兰计数,我们把长度为n的序列看成01串 关于卡特兰计数的详细的讲解 由此可知我们需 ...
- Codeforces Round #499 (Div. 2) C.FLY 数学推导_逆推
本题应该是可以使用实数二分的,不过笔者一直未调出来,而且发现了一种更为优美的解法,那就是逆推. 首先,不难猜到在最优解中当飞船回到 111 号节点时油量一定为 000, 这就意味着减少的油量等于减少之 ...
- 「模拟8.13」任(liu_runda的神题,性质分析)
考场时没有发现性质,用了个前缀和优化暴力,结果写WA了 我们发现其实联通块的个数就是点的个数-边的个数 然后我们需要维护横向上和纵向上的边的前缀和 前缀和的查询形式稍改一下 暴力 1 #include ...
- UVA - 10014 - Simple calculations (经典的数学推导题!!)
UVA - 10014 Simple calculations Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & ...
- Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题
4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 177 Solved: 128[Submit][Status ...
- [hdu5307] He is Flying [FFT+数学推导]
题面 传送门 思路 看到这道题,我的第一想法是前缀和瞎搞,说不定能$O\left(n\right)$? 事实证明我的确是瞎扯...... 题目中的提示 这道题的数据中告诉了我们: $sum\left( ...
- ZOJ3329(数学推导+期望递推)
要点: 1.期望的套路,要求n以上的期望,则设dp[i]为i分距离终点的期望步数,则终点dp值为0,答案是dp[0]. 2.此题主要在于数学推导,一方面是要写出dp[i] = 什么,虽然一大串但是思维 ...
- [国家集训队]整数的lqp拆分 数学推导 打表找规律
题解: 考场上靠打表找规律切的题,不过严谨的数学推导才是本题精妙所在:求:$\sum\prod_{i=1}^{m}F_{a{i}}$ 设 $f(i)$ 为 $N=i$ 时的答案,$F_{i}$ 为斐波 ...
随机推荐
- Python中Socket编程(TCP、UDP)
1. TCP协议下的如何解决粘包问题 TCP(transport control protocol 传输控制协议) 使用Nagle算法,将多次间隔较小且数据量小的数据,合并成大的数据块:接受端无法识 ...
- C++ primer plus读书笔记——第5章 循环和关系表达式
第5章 循环和关系表达式 1. cout.setf(ios_base::boolalpha); cout << (100 > 3) << endl;将输出true,而不是 ...
- 《前端运维》一、Linux基础--02用户与权限
其实说真的,这些基础挺枯燥的,内容呢绝大多数都是些静态的. 上一篇文章我们学习了基本的指令和vim编辑器的操作方法.这篇文章我们主要来学习下Linux中用户的概念和权限相关的知识. 一.用户与用户组 ...
- opencv——形态学深究(分析和应用)
摘要: 形态学一般指生物学中研究动物和植物结构的一个分支.用数学形态学(也称图像代数)表示以形态为基础对图像进行分析的数学工具. 基本思想是用具有一定形态的结构元素去度量和提取图像中的对应形状以达到对 ...
- MSSQL·最长输出长度限制之解决方案
阅文时长 | 0.11分钟 字数统计 | 234.4字符 主要内容 | 1.引言&背景 2.声明与参考资料 原文『MSSQL·最长输出长度限制之解决方案』 编写人 | SCscHero 编写时 ...
- 『动善时』JMeter基础 — 21、HTTP Cookie管理器的使用
目录 1.在HTTP信息头管理器组件中添加Cookie信息 (1)测试计划内包含的元件 (2)请求取样器内容 (3)HTTP信息头管理器内容 (4)查看结果 2.使用HTTP Cookie管理器组件来 ...
- [bug] JavaScript:Uncaught SyntaxError: missing ) after argument list
function拼写错误
- [bug] MySQL: The user specified as a definer ('root'@'%') does not exist
错误1 gciantispider.getchildlst does not exist 原因 getchildlst创建失败 解决 在mysql中设置mysqld中加上log_bin_trust_f ...
- 【转载】Windows 10系统默认将画面显示比例调整至125%或150%,最高分辨率已经达到3840×2160(4K)这一级别。
高分屏打开软件界面模糊?不会设置太浪费 2017-08-31 19:37 抹又重彩 现在有好多朋友都喜欢并买了高分屏笔记本电脑.高分屏笔记本就是配有高分辨率屏幕的笔记本.为了给用户带来更好的视觉体验, ...
- 查看linux系统是多少位,使用 getconf LONG_BIT
查看linux系统是多少位,使用 getconf LONG_BIT echo $HOSTTYPE