当前位置: 首页 > article >正文

枚举 组合数 P3799 妖梦拼木棒

P3799 妖梦拼木棒 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:可以发现对于 n n n来说是1e5, O ( n 2 ) O(n^2) O(n2)算法不行,但是发现对于每一个 a i a_i ai来说,都是**小于5e3的正整数。**对此,我们可以考虑枚举1到5e3进行计算。

对于四个棍子要形成一个正三角形来说,一定是有两个棍子是相同的,剩下两个棍子累加等于之前的棍子,即对于i,j,k,z四个棍子来说,当且仅当 i = j i = j i=j k + z = i k + z = i k+z=i时才能形成一个正三角形。

从1到5e3枚举两根棍子相同的情况,之后在找剩下两个棍子相加等于该棍子的情况,此时是 C c n t 2 C_{cnt}^2 Ccnt2

对此,有两种情况:

  • k = = z k == z k==z :这时计算是 C v 2 C_{v}^2 Cv2
  • k ! = z k != z k!=z:这时计算是 n u m k ∗ n u m z num_{k} * num_{z} numknumz

根据情况进行相乘并取模即可。计算时有除法操作,需要逆元。

代码如下:

const int mod = 1e9 + 7;
LL inv(LL a) {
    if(a == 0 || a == 1) return a;
    return (mod - mod/a) * inv(mod % a) % mod;
}
void solve() {
	int n; cin>>n;
	vector<int> a(5021);
	for(int i = 0; i < n ;++i) {
		int t; cin>>t;
		a[t]++;
	}
	int ans = 0;
	for(int i = 2; i <= 5000; ++i) {
		if(a[i] < 2) continue;
		int pre = (a[i] % mod* (a[i] - 1) % mod *inv(2)) % mod;;
		for(int j = 1; j <= i / 2; ++j) {
			if(j != i - j && a[j] > 0 && a[i - j] > 0) {
				int t = pre * a[j] % mod * a[i - j] % mod;
				ans = (ans + t) % mod;
			}
			if(j == i - j && a[j] > 1) {
				int t = pre * (a[j] % mod* (a[j] - 1) % mod *inv(2) % mod);
				ans = (ans + t) % mod;
			}
		}
	}
	cout<<ans<<endl;
}

http://www.kler.cn/a/146621.html

相关文章:

  • nginx 实现 正向代理、反向代理 、SSL(证书配置)、负载均衡 、虚拟域名 ,使用其他中间件监控
  • Mysql--运维篇--备份和恢复(逻辑备份,mysqldump,物理备份,热备份,温备份,冷备份,二进制文件备份和恢复等)
  • unity——Preject3——面板基类
  • 【绝对无坑】Mongodb获取集合的字段以及数据类型信息
  • SimpleFOC01|基于STM32F103+CubeMX,移植核心的common代码
  • 《盘古大模型——鸿蒙NEXT的智慧引擎》
  • MySQL--锁
  • NSGA-II求解微电网多目标优化调度(MATLAB)
  • 鼠标拖拽问题,不选中文本不触发单击事件
  • linux 搭建Nginx网页(编译安装)
  • OJ练习第186题——统计子串中的唯一字符
  • Python 进阶(十一):高精度计算(decimal 模块)
  • FTP服务器搭建
  • springBoot常见的问题
  • C++const指针的两种用法
  • 【SpringBoot3+Vue3】五【完】【实战篇】-前端(配合后端)
  • 学习课题:逐步构建开发播放器【QT5 + FFmpeg6 + SDL2】
  • springboot函数式web
  • 亚马逊云科技re:Invent大会:云计算与生成式AI共筑科技新局面,携手构建未来
  • ubuntu 安装 jetbrains-toolbox
  • 微服务保护 Sentinel
  • 知行之桥EDI系统HTTP签名验证
  • 自定义右键菜单栏
  • 使用Java连接Hbase
  • QT网络协议知识体系(一)
  • C++ 协程