分析:一道比较让人头疼的数学题.

先考虑怎么让分出来的三角形相似,先不考虑每个三角形的具体边长,设每个三角形的周长为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相关推荐

  1. 清北学堂模拟赛d5t4 套路

    分析:题目非常短,看起来非常难,其实把图一画就明白了.有向图,每个点的出度都是1,那么整个图肯定是环上套链,链上的边无论怎样反向都不会形成环,环上的边也可以随便反向,但是最终不能反为同向的,总方案数减 ...

  2. 清北学堂模拟赛d6t3 反击数

    分析:显然是一道数位dp题,不过需要一些奇怪的姿势.常规的数位dp能统计出一个区间内满足条件的数的个数,可是我们要求第k个,怎么办呢?转化为经典的二分问题,我们二分当前数的大小,看它是第几大的,就可以 ...

  3. 清北学堂模拟赛d2t4 最大值(max)

    题目描述 LYK有一本书,上面有很多有趣的OI问题.今天LYK看到了这么一道题目: 这里有一个长度为n的正整数数列ai(下标为1~n).并且有一个参数k. 你需要找两个正整数x,y,使得x+k< ...

  4. 清北学堂模拟赛d1t1 位运算1(bit)

    题目描述 LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥有的价值.例如数字123拥有6的价值,数字999拥有27的价值. 假设数字N的价值是K,LYK想找到 ...

  5. 清北学堂模拟赛day7 错排问题

    /* 考虑一下已经放回m本书的情况,已经有书的格子不要管他,考虑没有书的格子,不考虑错排有(n-m)!种,在逐步考虑有放回原来位置的情况,已经放出去和已经被占好的格子,不用考虑,剩下全都考虑,设t=x ...

  6. 清北学堂模拟赛d6t4 数组异或

    分析:直接O(n^3)做是只有50分的,可以加一点小小的优化,就是c[k]可以从c[k-1]得到,但是还是只有60分,从宏观意义上是不能继续优化了.对于这类涉及到位运算的性质的题目,将每个数转化成二进 ...

  7. 清北学堂模拟赛d6t2 刀塔

    分析:看到最小值最大就很显然是二分了吧,二分一下最小值,把小于它的数给删掉,然后看每个数向左边能延伸多长,往右边能延伸多长,最后统计一下有没有可行答案就可以了. #include <cstdio ...

  8. 清北学堂模拟赛d3t6 c

    分析:比较神奇的一道题.要把树变成环肯定要先变成链,然后把链给拼接成环.接下来考虑一个脑洞大开的树形dp:设f[i][0]表示i不与父节点相连的链数,f[i][1]表示i与父节点相连的链数,先考虑怎么 ...

  9. 2020清北学堂秋季营感想——Hoarfrost

    2020清北学堂秋季营感想 前言:九月三十日放假以后,就马不停蹄地开始了这一次的奥赛培训.原先参加过暑假的提高组腾飞营,当时第一场模拟赛拿了第一,便觉得CSP的题目难度不会很高,普及+/提高-左右的难 ...

最新文章

  1. SQL CREATE TABLE 语句(转)
  2. UNIX系统编程(2)
  3. MySQL—视图(一)
  4. 一个简单函数的反汇编分析
  5. 分布式文件系统FastDFS架构剖析
  6. 前端学习(2487):在VUE中使用element-ui的el-select组件时出现该报错
  7. (实战项目一)手机App抓包爬虫
  8. 打工人打工魂,打工人上人
  9. C++ 纯虚函数 虚函数 override
  10. java中model的意思_开发中model,entity和pojo的区别
  11. php小偷cookie,php小偷程序新概念之实时更新(二) | 学步园
  12. cmd 卸载mysql_彻底卸载MySQL图文教程
  13. 手写数字图像识别-SVM算法投票法实现多分类
  14. linux 安装环境
  15. CSS(Cascading Style Sheets)
  16. 封神台——手工注入基础(猫舍)
  17. uvm打印信息冗余度和重载打印信息
  18. 【安卓开发】android studio 学习入门篇
  19. 生成文件夹目录树结构给markdown使用
  20. 百万格子网站(成就百万富翁的梦想)

热门文章

  1. Android动画 详解(一 补间动画)
  2. 小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(一)视图共性 学习笔记...
  3. Object-C---gt;Swift之(三)nil合并运算符、范围运算符
  4. 使用java导入某个msn帐号的好友列表并发送消息
  5. WinAPI: GetWindow - 获取与指定窗口具有指定关系的窗口的句柄
  6. 写文章的时候,还是应该现在typora里面写,之后放在latex...因为typora好改
  7. apple给我的感受
  8. 有关Dispose,Finalize,GC.SupressFinalize函数-托管与非托管资源释放的模式
  9. Python 面向对象1-面向对象介绍
  10. 《F4+2》—团队项目系统设计改进与详细设计