首页 > 其他分享 >CF1725C Circular Mirror

CF1725C Circular Mirror

时间:2023-06-24 11:12:10浏览次数:32  
标签:种颜色 cnt CF1725C times int Mirror 直径 MOD Circular

虽然是一道绿题,但是感觉推式子时的一些细节还是值得学习的,并且还是有点 \(2\) \(hard\) \(4\) \(me\)......

一个圆上有 \(N\) 个可染色的点,编号 \(1\to N\)。\(N\) 号点和 \(1\) 号点相邻。
你可以用 \(M\) 种颜色将这些点染色。要求不能出现有三个同色点围成直角三角形。
请求出全部合法方案的总数,输出它模 \(998\ 244\ 353\) 的值。

显然,作为圆直径的点对可以跟非直径的点对分成两类。如何判断直径,只需要记录一下前缀和即可,然后得到直径点对数 \(cnt\)。

然后思路就有些混乱了。对于一个以直径为斜边的直角三角形,为了使它不染成同一种颜色,大体上可以归类于两种方法:

  • 把该直径上的两点染成同一种颜色,把其他所有点染成与之不同的颜色。
  • 把该直径上两点染成不同的颜色,其他点随便染。

结论看起来是简洁的,可是当时确实就绕在这两种情况里了,没能捋清楚。。。泵。

对直径上的点,染色有两种选择,自然联想到乘法原理,试着能否把两个步骤的选择数量乘起来以得其结果。但截至到目前,似乎还不太可行,因为不知道在 \(cnt\) 条直径中,哪些选择方案一染色,哪些选择方案二直接枚举
令 \(i\) 为选择方案一染色的直径点对数,则 \(cnt - i\) 为用方案二染色的直径点对数。
首先由于所有直径互不关联,故从 \(cnt\) 个直径中选 \(i\) 个直径的方案数为\(\begin{pmatrix}cnt\\i\end{pmatrix}\)。\(m\) 种颜色,从里面挑 \(i\) 个出来分配到 \(i\) 条直径中,\(i\) 个直径互不影响,因此是有顺序的。挑选、分配的方案为 \(A_m^i\)。

对于剩下的 \(cnt - i\) 条直径,已经选了 \(i\) 种颜色,还有 \(m-i\) 种颜色。要求直径两个端点颜色不同,则其中一个端点有 \(m - i\) 种颜色可选,另一个端点有 \(m - i - 1\) 种颜色可选。因为一共有 \(cnt - i\) 条直径,总的方案数就是 \(((m - i - 1) \times (m - i))^{cnt - i}\)。

剩下还有 \(n - 2 * cnt\) 个点,每个点有 \(m - i\) 种颜色选,总数就是 \((m - i)^{n - 2 * cnt}\)。
全部乘起来,求和:

\[ans = \sum_{i = 0}^{m}C_{cnt}^{i} \times A_{m}^{i} \times ((m - i - 1) \times (m - i))^{cnt - i} \times (m - i)^{n - 2 \times cnt} \]

然后就完了。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MOD = 998244353;
const int MAXN = 2e6;
int fac[MAXN + 5],inv[MAXN + 5],n,m,d[MAXN + 5];
map<int,bool> vis;
int qpow(int a,int n){
    int ret = 1;
    while(n){
        if(n & 1)ret = 1ll * ret * a % MOD;
        a = 1ll * a * a % MOD;
        n >>= 1;
    }
    return ret;
}
int c(int n,int m){
    if(m > n)return 0;
    return 1ll * fac[n] * inv[m] % MOD * inv[n - m] % MOD;
}
int a(int n,int m){
    if(n < m)return 0;
    return 1ll * fac[n] * inv[n - m] % MOD;
}
signed main(){
    fac[0] = 1;
    for(int i = 1; i <= MAXN; i++){
        fac[i] = 1ll * fac[i - 1] * i % MOD;
    }
    inv[MAXN] = qpow(fac[MAXN],MOD - 2);
    for(int i = MAXN; i; i--){
        inv[i - 1] = 1ll * inv[i] * i % MOD; 
    }
    scanf("%lld%lld",&n,&m);
    int sum = 0,tot = 0,cnt = 0;
    for(int i = 1; i <= n; i++){
        scanf("%lld",&d[i]);
        tot += d[i];

    }
    int p = tot;
    tot /= 2;
    vis[0] = 1;
    for(int i = 1; i < n; i++){
        sum += d[i];
        int k = sum - tot;
        if(vis.find(k) != vis.end())++cnt;
        vis[sum] = 1;
    }
    sum = 0;
    int x = tot - d[n];
    if(p % 2 == 1){
        cnt = 0;
    }
    long long ans = 0;
    for(int i = 0; i <= cnt; i++){
        ans = (1ll * ans + 1ll * c(cnt,i) * a(m,i) % MOD * qpow(m - i,n - cnt - i) % MOD * qpow(m - i - 1,cnt - i) % MOD) % MOD;
    }
    cout << ans % MOD;
}

标签:种颜色,cnt,CF1725C,times,int,Mirror,直径,MOD,Circular
From: https://www.cnblogs.com/CZ-9/p/17500826.html

相关文章

  • 第四届“强网”拟态防御国际精英挑战赛MISC-mirror
    题目附件请自取链接:https://pan.baidu.com/s/18K00ClgwJsqmKphPmqMpHw提取码:6r3jfull.png使用010Editor打开出现CRC校验报错,猜测需要修复宽高,其次发现了文件末尾附加了镜像翻转的png字节流数据将附加数据提取出来另存为png文件,通过分析不难发现将字节流数据逆序然后每十六个字......
  • 【VMware】CentOS6.5 Loaded plugins: fastestmirror, refresh-packagekit, security
    最近在用Centos6.5的时候出现了这种情况,[root@bogonDesktop]#yum-yinstalldockerLoadedplugins:fastestmirror,refresh-packagekit,securityLoadingmirrorspeedsfromcachedhostfile *base:mirrors.aliyun.com *extras:mirrors.nwsuaf.edu.cn *updates:m......
  • use a circular buffer for video frames on iOS
    https://stackoverflow.com/questions/33581369/how-to-use-tpcircularbuffer-for-videohttps://github.com/jeremytregunna/Ringhttps://www.codesd.com/item/is-it-possible-to-use-a-circular-buffer-for-video-images-on-ios.htmlhttp://atastypixel.com/blog/a-simple-fa......
  • 什么是 JavaScript 里的循环引用(circular references)
    JavaScript的循环引用(circularreferences)是指在对象之间存在相互引用的情况,形成一个闭环,导致对象无法被完全释放和垃圾回收。循环引用发生在当一个对象的属性或成员引用另一个对象,并且这个被引用的对象又直接或间接地引用回原始对象,从而形成一个循环。当存在循环引用时,JavaScrip......
  • Flutter控件之CircularProgressIndicator
    CircularProgressIndicator的作用Flutter中的CircularProgressIndicator是一个圆形进度指示器,用于表示正在进行的任务的进度。它通常用于长时间运行的任务,例如文件下载、网络请求等。CircularProgressIndicator可以在圆周上旋转,以表示正在进行的任务的进度,同时可以根据需要设置颜......
  • web3 产品介绍:Mirror.xyz是一个创新的去中心化出版平台
    Mirror.xyz是一个创新的去中心化出版平台,它使作者能够创建、发布和管理自己的内容,并与读者建立直接的经济联系。在本文中,我们将介绍Mirror.xyz的主要特点、功能以及如何使用它来发布和消费内容。一、Mirror.xyz的特点去中心化出版:Mirror.xyz采用去中心化的方式,将权力还给作者......
  • centos(linux):yum报错:removing mirrorlist with no valid mirrors的处理(centos 6.1
    一,报错[root@osc~]#yuminstall-ypython3-pipLoadedplugins:fastestmirror,securitySettingupInstallProcessDeterminingfastestmirrorsYumRepoError:AllmirrorURLsarenotusingftp,http[s]orfile.Eg.Invalidrelease/repo/archcombination/rem......
  • MAVEN setting.xml <mirrorOf></mirrorOf>
    MAVENsetting.xml<mirrorOf></mirrorOf>  <mirrorOf></mirrorOf>标签里面放置的是要被镜像的RepositoryID。为了满足一些复杂的需求,Maven还支持更高级的镜像配置:<mirrorOf>*</mirrorOf>匹配所有远程仓库。<mirrorOf>repo1,repo2</mirrorOf&g......
  • Open Source Mirror in China
    阿里巴巴腾讯华为清华大学中国科技大学上海交通大学南京大学南方科技大学浙江大学......
  • Maven的Mirror和Repository 的详细讲解
    1Repository(仓库) 1.1Maven仓库主要有2种:remote repository:相当于公共的仓库,大家都能访问到,一般可以用URL的形式访问localrepository:存放在本地磁盘的一个文件夹,例如,windows上默认是C:\Users\{用户名}\.m2\repository目录1.2Remote Repository主要有3种:中央仓库:http://repo1.ma......