原链接:
洛谷:点我QωQ
bzoj:点我QωQ

题意简述

一个长度为mmm的数列aaa,每个数都在[1,n][1,n][1,n]之间,有kkk个限制。第iii个限制包含两个正整数x,yx,yx,y,表示axa_xax​不能取yyy。求所有满足条件的aaa数列的所有元素之积之和。

数据

输入

第一行三个正整数,n,m,kn,m,kn,m,k(n,m&lt;=109,k&lt;=105)(n,m&lt;=10^9,k&lt;=10^5)(n,m<=109,k<=105)
接下来kkk行,每行两个正整数x,yx,yx,y。1&lt;=x&lt;=m,1&lt;=y&lt;=n1&lt;=x&lt;=m,1&lt;=y&lt;=n1<=x<=m,1<=y<=n

输出

所有满足条件的aaa数列的所有元素之积之和。

样例

输入
3 4 5
1 1
1 1
2 2
2 3
4 3
输出
90

解释

有一下几种:

数列
2 1 1 1 2
2 1 1 2 4
2 1 2 1 4
2 1 2 2 8
2 1 3 1 6
2 1 3 2 12
3 1 1 1 3
3 1 1 2 6
3 1 2 1 6
3 1 2 2 12
3 1 3 1 9
3 1 3 2 18

很明显,表中"积"一项的和为2+4+4+8+6+12+3+6+6+12+9+18=902+4+4+8+6+12+3+6+6+12+9+18=902+4+4+8+6+12+3+6+6+12+9+18=90

思路

题目名称叫"容易题",但是我非常想叫它"毒瘤题",我艹太tm^{tm}tm毒瘤了。。。

虽然样例解释给出的是暴力形式,但是显然我们是不珂以暴力做的。
我们想想(拿n=4,m=4n=4,m=4n=4,m=4举例),如果没有任何限制,那么积的和是多少呢?

显然,每个位置都珂以取1,2⋯n1,2\cdots n1,2⋯n,合法的数列有
{1,2,3,1}\{1,2,3,1\}{1,2,3,1},{1,2,3,2}\{1,2,3,2\}{1,2,3,2},{1,2,3,3}\{1,2,3,3\}{1,2,3,3},{1,2,3,4}\{1,2,3,4\}{1,2,3,4},⋯\cdots⋯
这是前四项。如果我们计算它们积的和,我们会发现珂以提一个公因式1×2×31\times 2\times 31×2×3出来,然后最后一项是(1+2+3+4)(1+2+3+4)(1+2+3+4),即这四个数列积的和为(1×2×3)×(1+2+3+4)(1\times 2\times 3)\times (1+2+3+4)(1×2×3)×(1+2+3+4).当然,我们珂以想象一下,如果我们把所有项都因式分解,应该长这样:
=(1+2+3+4)×(1+2+3+4)×(1+2+3+4)×(1+2+3+4)=(1+2+3+4)m=(n(n+1)2)m=(1+2+3+4)\times (1+2+3+4)\times (1+2+3+4) \times(1+2+3+4)=(1+2+3+4)^m=(\frac{n(n+1)}{2})^m=(1+2+3+4)×(1+2+3+4)×(1+2+3+4)×(1+2+3+4)=(1+2+3+4)m=(2n(n+1)​)m。

此时,我们考虑限制,按样例,第一个不能取111。此时我们发现,分解完的结果长成这样:
(2+3+4)×(1+2+3+4)3(2+3+4)\times(1+2+3+4)^3(2+3+4)×(1+2+3+4)3
就是第一个括号里少加了一个111。也就是说,对于一个限制(x,y)(x,y)(x,y),即第xxx个位置不能取yyy,对答案的影响就是第xxx个括号里减去一个yyy。(从样例中发现,有些限制会重复出现,这很好办,排序一下,然后whilewhilewhile循环替代++i++i++i即可)我们用cnt[i]cnt[i]cnt[i]表示第iii个括号里的值,每次减一下,到最后乘起来就是答案了。

当你开开心心的写完这个代码的时候,你会发现:wdnmd,m&lt;=109wdnmd,m&lt;=10^9wdnmd,m<=109!!!F∗∗KF**KF∗∗K!
所以我们需要优化。发现kkk并不大,只有10510^5105,所以只有这kkk个做过改动的对答案有影响,其它的就直接快速幂上去即可。由于我们刚刚在去重的时候就已经排过序了,所以代码也就没有什么变动,具体看注释。代码:

#include<bits/stdc++.h>
using namespace std;
namespace Flandle_Scarlet
{#define int long long#define mod 1000000007#define K 100100int n,m,k;struct node//保存一个约束{int pos,val;//位置,不能等于的值}a[K];bool operator<(node x,node y){return x.pos<y.pos or (x.pos==y.pos and x.val<y.val);}//排序:位置第一优先,不能等于的值第二优先void Input(){scanf("%lld%lld%lld",&n,&m,&k);for(int i=1;i<=k;++i){scanf("%lld%lld",&a[i].pos,&a[i].val);}sort(a+1,a+k+1);//记得排序}int cnt[K];//每个括号里的值//这里只记录被改动过的括号,别的括号里的值用快速幂乘上去int qpow(int a,int b,int m)//快速幂{int r=1;while(b){if (b&1) r=r*a%m;a=a*a%m,b>>=1;}return r;}int Next(int pos)//去重用的,用一个while循环找到第一个不相同的约束条件//样例里就有一个相同的...真tm毒瘤..{++pos;if (a[pos].pos!=a[pos-1].pos) return pos;while(a[pos].val==a[pos-1].val) ++pos;return pos;}void Solve(){int sum=n*(n+1)/2;sum%=mod;//没有被改动过的括号的值for(int i=1;i<=k;++i){cnt[i]=sum;}//初始都是=sum的int pos=0;//由于有一些不同的约束条件描述的是一个相同的位置(不能等于的值不同),//所以剩下的括号并不是n-k个,而是用这个pos存一下不同的个数for(int i=1;i<=k;i=Next(i)){if (a[i].pos!=a[i-1].pos){++pos;//如果描述的位置不同,就++}cnt[pos]=(cnt[pos]-a[i].val+mod)%mod;//对答案产生影响,所以要修改括号中的值//不能直接模,要+mod再模}int rest=m-pos;//剩下m-pos个括号里都是sumint ans=qpow(sum,rest,mod);//用快速幂乘上去for(int i=1;i<=pos;++i){ans*=cnt[i];ans%=mod;}//这一步上面解释过了printf("%lld\n",ans);}void Main(){if (0){freopen("","r",stdin);freopen("","w",stdout);}Input();Solve();}#undef int //long long#undef mod //1000000007
};
main()
{Flandle_Scarlet::Main();return 0;
}

回到总题解界面

洛谷 2220 [HAOI2012]容易题 题解(组合数学,离散化)相关推荐

  1. 洛谷2220 [HAOI2012]容易题

    标签:快速幂 题目 题目传送门 题目描述 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于 ...

  2. 互逆的压缩与解压(洛谷P1319、P1320题题解,Java语言描述)

    P1319题目要求 P1319题目链接 P1320题目要求 P1320题目链接 分析 这两个题啊,就是互逆过程嘛-- 说白了就是统计0与1,将一个0-1点阵压缩为一串数值或者将一串数值复原为一个0-1 ...

  3. 算成绩啦(洛谷P5740、P5741题题解,Java语言描述)

    P5740题目要求 P5740题目链接 P5740题意分析 这题比较水,简单的讲直接存一个max就完事... P5740代码(Java语言描述) import java.util.Scanner;pu ...

  4. 洛谷P1129 [ZJOI2007] 矩阵游戏 题解

    洛谷P1129 [ZJOI2007] 矩阵游戏 题解 题目链接:P1129 [ZJOI2007] 矩阵游戏 题意:给定一张有黑白棋子的正方形棋盘,问存不存在解法使得经过若干次交换行或列的操作后,左上角 ...

  5. 【NOIP2018】旅行 (洛谷P5049 / P5022) O(nlogn)题解

    阅读和学习本篇题解前,你应该掌握: C++ STL stack.vector.queue.pair的基本用法: 递归.搜索和贪心思想. 洛谷传送门 P5049 此题可以先从数据范围入手,观察m的范围( ...

  6. 洛谷P3647 [APIO2014] 连珠线 题解

    洛谷P3647 [APIO2014] 连珠线 题解 题目链接:P3647 [APIO2014] 连珠线 题意: 在达芬奇时代,有一个流行的儿童游戏称为连珠线.当然,这个游戏是关于珠子和线的.线是红色或 ...

  7. 洛谷P3336 [ZJOI2013]话旧 题解

    洛谷P3336 [ZJOI2013]话旧 题解 题目链接:P3336 [ZJOI2013]话旧 题意:小林跟着银河队选手去了一趟宇宙比赛,耳濡目染,变得学术起来.回来后,他发现世界大变样了.比丘兽究级 ...

  8. 洛谷P4683 [IOI2008] Type Printer 题解

    洛谷P4683 [IOI2008] Type Printer 题解 题目链接:P4683 [IOI2008] Type Printer 题意: 你需要利用一台可移动的打印机打印出NNN个单词.这种可移 ...

  9. 洛谷 P2791 幼儿园篮球题

    洛谷 P2791 幼儿园篮球题 https://www.luogu.org/problemnew/show/P2791 我喜欢唱♂跳♂rap♂篮球 要求的是:\(\sum_{i=0}^kC_m^iC_ ...

最新文章

  1. 占失物,笔记本电脑电池
  2. 【汇总】一大波CVPR2020开源项目重磅来袭!
  3. Ubuntu下Qt配置Opencv
  4. C# 中对WinForm窗体中的控件快速设置TableIndex次序
  5. Error: bin/bash^M: bad interpreter: no such file o
  6. RESTful Web 服务 - 安全性
  7. python 消息队列 sqlite_sqlite 数据存储 消息队列
  8. 组合数据类型综合练习
  9. Linux 零拷贝 sendfile函数中文说明及实际操作
  10. MySQL:基本命令
  11. Android使用Application的好处
  12. cs231n作业1——knn
  13. Java中this关键字的使用
  14. 解决百度BMR的spark集群开启slaves结点的问题
  15. 奥维天地图解决办法!如何申请个人天地图API密钥?
  16. 舱机器人尾巴毛茸茸_这个毛茸茸的机器人不仅可撸,还会摇尾巴
  17. 2013年c语言课后作业答案,C语言课后作业答案.pdf
  18. java计算机毕业设计个人交友网站源码+数据库+系统+lw文档+mybatis+运行部署
  19. [ASP.NET MVC 小牛之路]16 - Model 验证
  20. 社工小组 计算机小组活动,小组工作活动计划1

热门文章

  1. (二)以太坊——在私有链进行转账操作
  2. matlab中双引号,我如何在Matlab的细胞去掉双引号?
  3. Windows死机代码翻译大全
  4. 性能测试之cpu 分析
  5. [转]FTK在RT-Thread的演示(win32平台)
  6. 【linux指南--命令大全】
  7. cad布局怎么用_【CAD教程】CAD布局视频教程111集(点击菜单播放所需要看的教程,戳以下蓝色字体进入视频教程)...
  8. 曦力DVD备份及转换软件 Xilisoft DVD Ripper Ultimate 6绿色版
  9. java抓取工具_抓取工具Web-Harvest - dayang2001911 - JavaEye技术网站
  10. SVS为某高校打造大型多功能厅