Codeforces 1262F Wrong Answer on test 233(组合数)
E1:设dp[i][j],表示在第i个位置的当前新状态超过原状态j分的方案数是dp[i][j],那么对于这种情况直接进行转移即可,如果a[i]==b[i]显然k种选择都可以,不影响j,如果不一样,这个位置填了a[i]那么状态从dp[i-1][j+1]转移过来,如果填了b[i]就是dp[i-1][j-1]转移,当然也可以两个都不填,那么剩下一共是k-2种选择,j不变,最后答案将所有超过分数为正数的加起来即可,因此总体复杂度O(nk)。
E2:我们可以从E1的递推式子中发现,新状态超过原状态的方案和原状态超过新状态的方案这两者是等价的问题,那么我们可以进行简单使用总方案数减去分数相同的方案数最后除二就是答案,那么我们可以枚举新状态一共多原状态j分,原状态一共多新状态j分,因为这两者在最后是打平的,这两者在只有在a[i]!=b[i]的时候才会发生超对方一分的情况,那么我们记num为一共有多少个a[i]!=b[i]的情况,然后我们枚举共超过对方i分,那么我们需要从num中挑i次是选择的a,再从剩下的num-i次中选择b,那么还剩下nun-2*i的部分是a[i]!=b[i],但是又不能影响超过的分数,那么只能选既不是a[i]也不是b[i]共k-2中选择,那么乘上(k-2)(num-2*i),最后n-num的部分是a[i]==b[i],对于这部分不论取什么对于两者的贡献是一样的,那么一共有k种选择,所以最后再乘上k(n-num)即可。
O(nk)
// ——By DD_BOND #include<bits/stdc++.h> using namespace std; typedef long long ll; const int MOD=; ll dp[][];
int a[],b[]; int main(void)
{
ios::sync_with_stdio(false); cin.tie(); cout.tie();
ll n,k; cin>>n>>k;
for(int i=;i<=n;i++) cin>>a[i];
for(int i=;i<=n;i++) b[i]=a[i%n+];
dp[][n+]=;
for(int i=;i<=n;i++){
for(int j=;j<=*n+;j++){
if(a[i]==b[i]) dp[i][j]=dp[i-][j]*k%MOD;
else dp[i][j]=((dp[i-][j-]+dp[i-][j+])%MOD+dp[i-][j]*(k-)%MOD)%MOD;
}
}
ll ans=;
for(int i=n+;i<=*n+;i++) ans=(ans+dp[n][i])%MOD;
cout<<ans<<endl;
return ;
}
O(nlogk)
// ——By DD_BOND #include<bits/stdc++.h> using namespace std; typedef long long ll; const int MOD=;
const int MAXN=1e6+; ll qpow(ll a,ll n){ll sum=;while(n){if(n&)sum=sum*a%MOD;a=a*a%MOD;n>>=;}return sum;} int a[MAXN],b[MAXN];
int fac[MAXN],rfac[MAXN],inv[MAXN]; int C(int n,int m){
if(n-m<m) m=n-m;
if(m==) return ;
return 1ll*fac[n]*rfac[m]%MOD*rfac[n-m]%MOD;
} int main(void)
{
ios::sync_with_stdio(false); cin.tie(); cout.tie();
fac[]=rfac[]=inv[]=;
for(int i=;i<MAXN;i++) inv[i]=1ll*(MOD-MOD/i)*inv[MOD%i]%MOD;
for(int i=;i<MAXN;i++) fac[i]=1ll*fac[i-]*i%MOD,rfac[i]=1ll*rfac[i-]*inv[i]%MOD;
int n,k,num=,ans=; cin>>n>>k;
for(int i=;i<=n;i++) cin>>a[i];
if(k==) return cout<<<<endl,;
for(int i=;i<=n;i++)
if(a[i]!=a[i%n+])
num++;
for(int i=;*i<=num;i++) ans=(ans+1ll*C(num,i)*C(num-i,i)%MOD*qpow(k-,num-*i)%MOD*qpow(k,n-num)%MOD)%MOD;
cout<<(qpow(k,n)-ans+MOD)%MOD*inv[]%MOD<<endl;
return ;
}
Codeforces 1262F Wrong Answer on test 233(组合数)的更多相关文章
- Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3) F2. Wrong Answer on test 233 (Hard Version) dp 数学
F2. Wrong Answer on test 233 (Hard Version) Your program fails again. This time it gets "Wrong ...
- Codeforces 785D Anton and School - 2 (组合数相关公式+逆元)
D. Anton and School - 2 time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- CodeForces - 140E:New Year Garland (组合数&&DP)
As Gerald, Alexander, Sergey and Gennady are already busy with the usual New Year chores, Edward has ...
- CodeForces - 367E:Sereja and Intervals(组合数&&DP)
Sereja is interested in intervals of numbers, so he has prepared a problem about intervals for you. ...
- Codeforces 785D Anton and School - 2(组合数)
[题目链接] http://codeforces.com/problemset/problem/785/D [题目大意] 给出一个只包含左右括号的串,请你找出这个串中的一些子序列, 要求满足" ...
- Educational Codeforces Round 80 C. Two Arrays(组合数快速取模)
You are given two integers nn and mm . Calculate the number of pairs of arrays (a,b)(a,b) such that: ...
- codeforces 459C Pashmak and Buses(模拟,组合数A)
题目 跑个案例看看结果就知道了:8 2 3 题目给的数据是 n,k,d 相当于高中数学题:k个人中选择d个人排成一列,有多少种不同的方案数,列出其中n中就可以了. #include<iostre ...
- Codeforces 57C (1-n递增方案数,组合数取模,lucas)
这个题相当于求从1-n的递增方案数,为C(2*n-1,n); 取模要用lucas定理,附上代码: #include<bits/stdc++.h> using namespace std; ...
- 【CF1262F】Wrong Answer on test 233(数学)
题意:给定n道题目,每道题目有k个选项,已知所有正确选项,选对1题得1分 问循环后移一格后总得分s2大于原先总得分s1的方案数 n<=2e5,1<=k<=1e9 思路:特判k=1 e ...
随机推荐
- 【java工具类】POI导出excel
POI的maven依赖:<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi&l ...
- NOIP游(GUNCU)记
小学奥数不会做 状压DP打不出 一脸懵逼 本来抱着一个拿省一的心态去考的,结果DAY1刚开始就爆炸了. T1居然想了半个小时多没思路,然后打了个表,可能是应为太紧张了吧,居然打了表之后还没有看出规律来 ...
- socket模块其他用法
1.socket模块的其他方法 服务端套接字函数 s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始TCP监听 s.accept() 被动接受TCP客户的连接,(阻塞式)等待连 ...
- (65)CRC32校验C语言版本
#include<iostream> # include <stdio.h> # include <string.h> typedef unsigned int u ...
- A - 地震预测
A - 地震预测 怀特先生是一名研究地震的科学家,最近他发现如果知道某一段时间内的地壳震动能量采样的最小波动值之和,可以有效地预测大地震的发生. 假设已知一段时间的n次地壳震动能量的采样值为a1,a2 ...
- 测试常用命令之awk篇
awk/gawk 1,内置变量 FILENAME:输入文件名称 FNR:当前数据文件中的数据行数 NF:数据文件中的字段总数 NR:已处理的输入数据行数目 FS:输入数据段分隔符 RS:输入数据行分隔 ...
- 一台linux机器远程mount另一台linux机器
本机电脑系统是unbantu,要将另一台linux电脑上的文件mount到本机目录下.mount的原理是网络文件系统,即NFS,本机操作步骤如下 一,安装 nfs-common : apt inst ...
- spring boot shiro redis整合基于角色和权限的安全管理-Java编程
一.概述 本博客主要讲解spring boot整合Apache的shiro框架,实现基于角色的安全访问控制或者基于权限的访问安全控制,其中还使用到分布式缓存redis进行用户认证信息的缓存,减少数据库 ...
- legend3---阿里云如何多个域名指向同一个网站
legend3---阿里云如何多个域名指向同一个网站 一.总结 一句话总结: 先寻求资料及文档,没有找到的话自己摸索一下就好 结论:多个域名都需要备案 二.阿里云如何多个域名指向同一个网站 当前情况 ...
- WIN10下安装Linux子系统并安装xface4界面
WIN10下安装Linux子系统并安装xface4界面,使用win10自带的远程桌面工具登陆成功. 成功截图: 安装步骤 1.安装[适用于Linux的Windows子系统]组件 2.win10应用商店 ...