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(组合数)的更多相关文章

  1. 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 ...

  2. 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 ...

  3. CodeForces - 140E:New Year Garland (组合数&&DP)

    As Gerald, Alexander, Sergey and Gennady are already busy with the usual New Year chores, Edward has ...

  4. CodeForces - 367E:Sereja and Intervals(组合数&&DP)

    Sereja is interested in intervals of numbers, so he has prepared a problem about intervals for you. ...

  5. Codeforces 785D Anton and School - 2(组合数)

    [题目链接] http://codeforces.com/problemset/problem/785/D [题目大意] 给出一个只包含左右括号的串,请你找出这个串中的一些子序列, 要求满足" ...

  6. 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: ...

  7. codeforces 459C Pashmak and Buses(模拟,组合数A)

    题目 跑个案例看看结果就知道了:8 2 3 题目给的数据是 n,k,d 相当于高中数学题:k个人中选择d个人排成一列,有多少种不同的方案数,列出其中n中就可以了. #include<iostre ...

  8. Codeforces 57C (1-n递增方案数,组合数取模,lucas)

    这个题相当于求从1-n的递增方案数,为C(2*n-1,n); 取模要用lucas定理,附上代码: #include<bits/stdc++.h> using namespace std; ...

  9. 【CF1262F】Wrong Answer on test 233(数学)

    题意:给定n道题目,每道题目有k个选项,已知所有正确选项,选对1题得1分 问循环后移一格后总得分s2大于原先总得分s1的方案数 n<=2e5,1<=k<=1e9 思路:特判k=1 e ...

随机推荐

  1. spring cloud-1

  2. Linux下lazarus交叉编译 win32[win64]

    环境 vmvare + deepin Linux64 + lazarus2.0.6 参考:https://wiki.freepascal.org/Cross_compiling_for_Win32_u ...

  3. Nginx做反向代理时访问端口被自动去除

    使用的Nginx版本 : nginx/1.13.10 出现问题的配置文件如下 upstream http-web { server 0.0.0.0:9000; } server { listen 80 ...

  4. Memcached在Asp.net下的应用

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached ...

  5. js 反斜杠 处理

    var t = jsonstr.replace(/\\/g,"\\\\\\\\"); --\\ 表示 代码 输出 \' 单引号 \" 双引号 \& 和号 \\ 反 ...

  6. Html5大文件断点续传实现方法

    之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...

  7. #333 Div2 Problem B Approximating a Constant Range (尺取 && RMQ || 尺取 && multiset)

    题目链接:http://codeforces.com/contest/602/problem/B 题意 :给出一个含有 n 个数的区间,要求找出一个最大的连续子区间使得这个子区间的最大值和最小值的差值 ...

  8. 微信小程序访问后台出现 对应的服务器证书无效。控制台输入 showRequestInfo() 可以获取更详细信息。

    检查微信开发者平台配置 https 服务端 nginx 配置 ssl 协议是否有效 在开发者工具中可以使用(详情 > 不校验合法域名.web-view(业务域名).TLS 版本以及 HTTPS ...

  9. 1-window搭建git

    windows7搭建Git私服 作为版本控制工具大多公司会选用Git,但svn也具有一定的优势,在对开源项目管理方面,Git具有一定的优势,我们可以将自己的项目放到GitHub上面,供大家交流学习,但 ...

  10. NBU5240备份系统还原数据库---Windows版

    NBU5240是一个基于系统文件和多种数据库备份的灾备系统,灵活性比较高.下面具体记录如何利用该系统的备份文件进行数据库还原.(基于业务场景) 公司某业务部门突然发现前台系统数据有异常,已经是几天前的 ...