清北学堂模拟赛d3t2 b
分析:一道比较让人头疼的数学题.
先考虑怎么让分出来的三角形相似,先不考虑每个三角形的具体边长,设每个三角形的周长为li,则可知必然有一个数g = gcd{li},每一个三角形的周长都是g的倍数,这样就会有n/g个单位三角形,我们只需要把n/g分配给若干个三角形就可以了,利用隔板法,可以算出方案数为2^(n/g - 1).
再来考虑知道了周长怎么求这个周长的三角形有多少个.为了方便起见,设a ≤ b ≤ c,s = a + b + c,如果b = c,那么s = a + 2b,b的取值范围就是[g/3上取整,(g-1)/2下取整],看看取值范围内有多少个整数就有多少种方案.如果b < c,那么可以把c--,直到变成b=c,那么就是f[i] = f[i - 1],但是这样有一种特殊情况:a + b = c,这在f[i - 1]中是合法的,但是我们在处理的时候要减掉这种方案.s = 2c,c = g/2,显然只有g是偶数的时候才会出现这种情况,这时a和b只能取g/4个数,方案数减去g/4就可以了.
但是这样还是不行,如果一个三角形边长是2,2,3,另外一个是4,4,6,那么可以将前面一个三角形作为单位三角形分配给后面的三角形,直接计算会将一个方案算多次,所以我们要求的f[s],s = a + b + c中的a,b,c必须是互质的,为了去重,每一个f[s] -= f[k],k | s.就可以了.
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath>using namespace std;const int mod = 1e9 + 7;typedef long long ll; ll n, f[1000010], p[1000010], cnt, mi[1000010], ans;void add(ll &a, ll b) {a += b;if (a >= mod)a -= mod; }int main() {scanf("%lld", &n);for (ll i = 3; i <= n; i++){f[i] = f[i - 1];add(f[i], (i - 1) / 2 - ceil((double)i * 1.0 / 3) + 1);if (!(i & 1))f[i] -= i / 4;}for (ll i = 1; i * i <= n; i++)if (n % i == 0){if (i * i != n){p[++cnt] = i;p[++cnt] = n / i;}elsep[++cnt] = i;}sort(p + 1, p + 1 + cnt);for (ll i = 1; i <= cnt; i++)for (ll j = 1; j < i; j++)if (p[i] % p[j] == 0)add(f[p[i]], mod - f[p[j]]);mi[0] = 1;for (ll i = 1; i <= n; i++){mi[i] = mi[i - 1];add(mi[i], mi[i - 1]);}for (ll i = 1; i <= cnt; i++)add(ans, mi[n / p[i] - 1] * f[p[i]] % mod);printf("%lld\n", ans);return 0; }
转载于:https://www.cnblogs.com/zbtrs/p/7650595.html
清北学堂模拟赛d3t2 b相关推荐
- 清北学堂模拟赛d5t4 套路
分析:题目非常短,看起来非常难,其实把图一画就明白了.有向图,每个点的出度都是1,那么整个图肯定是环上套链,链上的边无论怎样反向都不会形成环,环上的边也可以随便反向,但是最终不能反为同向的,总方案数减 ...
- 清北学堂模拟赛d6t3 反击数
分析:显然是一道数位dp题,不过需要一些奇怪的姿势.常规的数位dp能统计出一个区间内满足条件的数的个数,可是我们要求第k个,怎么办呢?转化为经典的二分问题,我们二分当前数的大小,看它是第几大的,就可以 ...
- 清北学堂模拟赛d2t4 最大值(max)
题目描述 LYK有一本书,上面有很多有趣的OI问题.今天LYK看到了这么一道题目: 这里有一个长度为n的正整数数列ai(下标为1~n).并且有一个参数k. 你需要找两个正整数x,y,使得x+k< ...
- 清北学堂模拟赛d1t1 位运算1(bit)
题目描述 LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥有的价值.例如数字123拥有6的价值,数字999拥有27的价值. 假设数字N的价值是K,LYK想找到 ...
- 清北学堂模拟赛day7 错排问题
/* 考虑一下已经放回m本书的情况,已经有书的格子不要管他,考虑没有书的格子,不考虑错排有(n-m)!种,在逐步考虑有放回原来位置的情况,已经放出去和已经被占好的格子,不用考虑,剩下全都考虑,设t=x ...
- 清北学堂模拟赛d6t4 数组异或
分析:直接O(n^3)做是只有50分的,可以加一点小小的优化,就是c[k]可以从c[k-1]得到,但是还是只有60分,从宏观意义上是不能继续优化了.对于这类涉及到位运算的性质的题目,将每个数转化成二进 ...
- 清北学堂模拟赛d6t2 刀塔
分析:看到最小值最大就很显然是二分了吧,二分一下最小值,把小于它的数给删掉,然后看每个数向左边能延伸多长,往右边能延伸多长,最后统计一下有没有可行答案就可以了. #include <cstdio ...
- 清北学堂模拟赛d3t6 c
分析:比较神奇的一道题.要把树变成环肯定要先变成链,然后把链给拼接成环.接下来考虑一个脑洞大开的树形dp:设f[i][0]表示i不与父节点相连的链数,f[i][1]表示i与父节点相连的链数,先考虑怎么 ...
- 2020清北学堂秋季营感想——Hoarfrost
2020清北学堂秋季营感想 前言:九月三十日放假以后,就马不停蹄地开始了这一次的奥赛培训.原先参加过暑假的提高组腾飞营,当时第一场模拟赛拿了第一,便觉得CSP的题目难度不会很高,普及+/提高-左右的难 ...
最新文章
- SQL CREATE TABLE 语句(转)
- UNIX系统编程(2)
- MySQL—视图(一)
- 一个简单函数的反汇编分析
- 分布式文件系统FastDFS架构剖析
- 前端学习(2487):在VUE中使用element-ui的el-select组件时出现该报错
- (实战项目一)手机App抓包爬虫
- 打工人打工魂,打工人上人
- C++ 纯虚函数 虚函数 override
- java中model的意思_开发中model,entity和pojo的区别
- php小偷cookie,php小偷程序新概念之实时更新(二) | 学步园
- cmd 卸载mysql_彻底卸载MySQL图文教程
- 手写数字图像识别-SVM算法投票法实现多分类
- linux 安装环境
- CSS(Cascading Style Sheets)
- 封神台——手工注入基础(猫舍)
- uvm打印信息冗余度和重载打印信息
- 【安卓开发】android studio 学习入门篇
- 生成文件夹目录树结构给markdown使用
- 百万格子网站(成就百万富翁的梦想)
热门文章
- Android动画 详解(一 补间动画)
- 小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(一)视图共性 学习笔记...
- Object-C---gt;Swift之(三)nil合并运算符、范围运算符
- 使用java导入某个msn帐号的好友列表并发送消息
- WinAPI: GetWindow - 获取与指定窗口具有指定关系的窗口的句柄
- 写文章的时候,还是应该现在typora里面写,之后放在latex...因为typora好改
- apple给我的感受
- 有关Dispose,Finalize,GC.SupressFinalize函数-托管与非托管资源释放的模式
- Python 面向对象1-面向对象介绍
- 《F4+2》—团队项目系统设计改进与详细设计