[NOI.AC] count
思路:
考虑组合数学。
当所求中没有重复的时候,方案数就是\(C_{n + 1}^{k}\)
当有重复的时候...
设相等的数字之间的距离为\(len\)
当取0个数时,方案数就是\(C_{n - 1}^{k}\)
取1个数时,方案数大概是\(2 * C_{n - 1}^{k - 1}\) ,但是如果相同的数字之间那一段没有取任何一个其他的数,那么取任意一个相同的数都是等价的,所以要减去\(C_{n - len}^{i - 1}\)
取了两个数,方案数就是\(C_{n - 1}^{k - 2}\)
考试炸了范围...
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
const int maxn = 200010;
const int mod = 1e9+7;
int n;
inline int pow_mod(int x,int y) {
int res = 1;
while(y) {
if(y & 1) res = res * x % mod;
x = x * x % mod;
y >>= 1;
}
return res % mod;
}
inline int read() {
int q=0,f=1;char ch = getchar();
while(!isdigit(ch)){
if(ch==-'-')f=-1;ch=getchar();
}
while(isdigit(ch)){
q=q*10+ch-'0';ch=getchar();
}
return q*f;
}
int fac[maxn];
int a[maxn];
int vis[maxn];
int ifac[maxn];
inline int C(int x,int y) {
if(x < y) return 0;
if(y < 0) return 0;
return fac[x] * ifac[y] % mod * ifac[x - y] % mod;
}
int len;
int ans[maxn];
inline void pre () {
fac[0] = 1;
for(int i = 1;i <= n + 1; ++i) {
fac[i] = fac[i - 1] * i % mod;
}
ifac[n + 1] = pow_mod(fac[n + 1],mod - 2);
for(int i = n;i >= 0; --i) {
ifac[i] = ifac[i + 1] * (i + 1) % mod;
}
}
signed main () {
n = read();
for(int i = 1;i <= n + 1; ++i) {
a[i] = read();
if(vis[a[i]] == 0) {
vis[a[i]] = i;
}
else len = i - vis[a[i]] + 1;
}
pre();
for(int i = 1;i <= n + 1; ++i) {
int res = C(n - 1,i);
res = (res + 2 * C(n - 1,i - 1)) % mod;
res = (res - C(n - len + 1,i - 1) + mod) % mod;
res = (res + C(n - 1,i - 2)) % mod;
ans[i] = res;
}
for(int i = 1;i <= n + 1; ++i)
printf("%lld\n",ans[i]);
return 0;
}
[NOI.AC] count的更多相关文章
- [NOI.AC]COUNT(数学)
解析: 也可以将所有的可能都计算出来,后进行减法运算. 代码: #include<bits/stdc++.h> using namespace std; #define ll long l ...
- NOI.AC NOIP模拟赛 第五场 游记
NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...
- SDOI2015 寻宝游戏 | noi.ac#460 tree
题目链接:戳我 可以知道,我们相当于是把有宝藏在的地方围了一个圈,求这个圈最小是多大. 显然按照dfs序来遍历是最小的. 那么我们就先来一遍dfs序列,并且预处理出来每个点到根的距离(这样我们就可用\ ...
- # NOI.AC省选赛 第五场T1 子集,与&最大值
NOI.AC省选赛 第五场T1 A. Mas的童年 题目链接 http://noi.ac/problem/309 思路 0x00 \(n^2\)的暴力挺简单的. ans=max(ans,xor[j-1 ...
- NOI.ac #31 MST DP、哈希
题目传送门:http://noi.ac/problem/31 一道思路好题考虑模拟$Kruskal$的加边方式,然后能够发现非最小生成树边只能在一个已经由边权更小的边连成的连通块中,而树边一定会让两个 ...
- NOI.AC NOIP模拟赛 第六场 游记
NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...
- NOI.AC NOIP模拟赛 第二场 补记
NOI.AC NOIP模拟赛 第二场 补记 palindrome 题目大意: 同[CEOI2017]Palindromic Partitions string 同[TC11326]Impossible ...
- NOI.AC NOIP模拟赛 第一场 补记
NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...
- NOI.AC NOIP模拟赛 第四场 补记
NOI.AC NOIP模拟赛 第四场 补记 子图 题目大意: 一张\(n(n\le5\times10^5)\)个点,\(m(m\le5\times10^5)\)条边的无向图.删去第\(i\)条边需要\ ...
随机推荐
- leetcode-163周赛-1260-二维网格迁移
题目描述: 自己的提交: class Solution: def shiftGrid(self, grid: List[List[int]], k: int) -> List[List[int] ...
- jsp EL运算符
算术运算符 算术运算符 说明 示例 结果 + 加 ${1 + 1} 2 - 减 ${1 - 1} 0 * 乘 ${1 * 2} 2 /或div 除 ${3 / 2} 1.5 %或mod 取余 ${3 ...
- Magento 消息提示
Magento 消息提示 //成功 Mage::getSingleton('customer/session')->addSuccess('恭喜您关联会员卡成功!'); //失败 Mage::g ...
- vue中的toast组件
首先在components新建组件文件夹 随后在toast.vue中写入弹框样式 <template> <transition name="demo"> & ...
- 【C#技术】一篇文章搞掂:LLBL
公司代码速查 ParameterBase.CurrentUser.UserId ICustomerDeskDetailManager customerDeskDetailManager = Clien ...
- debian 8 安装 codeblocks
CodeBlocks优点: 1.所占资源少,对电脑硬件的要求低 2.开源软件,可以查看源代码,虽然我不会修改,但是如果我做一个IDE的话,我一定会参考这个伟大的软件的. 3.最重要的是,它完全跨了三大 ...
- Codeforcs 1183B Equalize Prices
题目链接:codeforces.com/problemset/problem/1183/B 题意:给你 n 个数,每个数能在k范围内上下浮动,求能否使所有数相等,能输出相等的最大值,不能输出 -1. ...
- 【Java多线程系列随笔一】浅析 Java Thread.join()
一.在研究join的用法之前,先明确两件事情. 1.join方法定义在Thread类中,则调用者必须是一个线程, 例如: Thread t = new CustomThread(); //这里一般是自 ...
- 关于版本管理工具SVN
曾经使用过Git,但是目前使用的是相对简单的svn. 刚使用的时候,如果不出意外.会有同学配好环境与权限. 前端只需要将代码下载,修改,更新,与上传. 一 .下载 1.本地新建文件夹,作为本地仓库 命 ...
- 13、如何拆分含有多种分隔符的字符串 14、如何判断字符串a是否以字符串b开头或结尾 15、如何调整字符串中文本的格式 16、如何将多个小字符串拼接成一个大的字符串
13.如何拆分含有多种分隔符的字符串 import re s = "23:41:2314\1234#sdf\23;" print(re.split(r'[#:\;]+',s)) ...