D、数列求和(嘤雄难度) J、滑稽树下你和我 I、滑稽树上滑稽果
D、数列求和(嘤雄难度)
1、
2、
3、考虑先求出 的所有质因数,然后通过容斥来求所有与 不互质的 的和。
4、假设当前容斥算的质数是 ,那么就有 个该质数的倍数,即要求
,式子化简得,求和公式再化简即可在时间内算出结果。
Code:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod = 1e9 + 7;
vector<ll>v;
ll power(ll a, ll b)
{ll res = 1;while (b){if (b & 1)res = res * a % mod;a = a * a % mod;b >>= 1;}return res;
}
void get(ll k)
{for (int i = 2; i * i <= k; i++){if (k % i == 0){v.push_back(i);while (k % i == 0)k /= i;}}if (k > 1)v.push_back(k);
}
ll n, m;
ll inv2 = power(2, mod - 2);
ll inv6 = power(6, mod - 2);
ll calc(ll k)
{ll cnt = n / k;ll res = ((k * k % mod) * (cnt * (cnt + 1) % mod) % mod) * ((2 * cnt + 1) * inv6 % mod) % mod + (cnt * (cnt + 1) % mod) * (k * inv2 % mod) % mod;return res % mod;
}
int main()
{while (scanf("%lld%lld", &n, &m) > 0){v.clear();get(m);int sz = v.size();ll ans = 0;for (int i = 0; i < (1 << sz); i++){int num = 1, cishu = 0;for (int j = 0; j < sz; j++){if (i & (1 << j)){num *= v[j];cishu++;}}if (cishu & 1)ans = (ans - calc(num) + mod) % mod;elseans = (ans + calc(num)) % mod;}printf("%lld\n", ans);}
}
J、滑稽树下你和我
计算每条边的贡献,即两边点的个数的乘积,然后再乘这条边的长度,总和就是答案
Code:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN = 1e5 + 5;
const ll mod = 1e9 + 7;
struct edge
{int to;ll w;int nex;
}e[MAXN * 2];
int head[MAXN], tot = 1;
void add(int a, int b, ll c)
{e[tot] = edge{ b,c,head[a] };head[a] = tot++;
}
int num[MAXN], n;
bool vis[MAXN];
void init()
{memset(head, -1, sizeof(head));tot = 1;
}
ll ans = 0;
#define Pair pair<int,int>
map<Pair,ll>mp;
void dfs(int u, int fa)
{num[u] = 1;for (int i = head[u]; i + 1; i = e[i].nex){int v = e[i].to;if (v != fa){dfs(v, u);num[u] += num[v];ll ad = 1LL * (n - num[v]) * num[v] % mod;if (u < v)ad *= mp[Pair{ u,v }];elsead *= mp[Pair{ v,u }];ad %= mod;ans = (ans + ad) % mod;}}
}
int main()
{init();int a, b;ll c;scanf("%d", &n);for (int i = 1; i < n; i++){scanf("%d%d%lld", &a, &b, &c);add(a, b, c);add(b, a, c);if (a > b)swap(a, b);mp[Pair{ a,b }] = c;}dfs(1, 0);printf("%lld\n", ans);
}
I、滑稽树上滑稽果
莫队算法,考虑将所求的作为单独一项 即 ,为了方便,下面将使用 来表示 。
预处理阶乘和阶乘的逆元
Code:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod = 1e9 + 7;
const int MAXN = 1e5 + 5;
struct node
{int index;int n;int m;
}in[MAXN];
int id[105];
ll fac[MAXN], inv[MAXN];
ll ans[MAXN];
ll power(ll a, ll b)
{ll res = 1;while (b){if (b & 1)res = res * a % mod;a = a * a % mod;b >>= 1;}return res;
}
void init()
{fac[0] = fac[1] = 1;for (int i = 2; i < MAXN; i++)fac[i] = fac[i - 1] * i % mod;inv[0] = inv[1] = 1;inv[100000] = power(fac[100000], mod - 2);for (int i = 99999; i > 1; i--)inv[i] = inv[i + 1] * (i + 1) % mod;
}
ll comb(ll a, ll b)
{if (a < b || b < 0)return 0;ll res = fac[a] * inv[b] % mod * inv[a - b] % mod;return res;
}
ll inv2 = (mod + 1) / 2;
int unit;
int main()
{init();int num;scanf("%d", &num);for (int i = 0; i < num; i++){in[i].index = i;scanf("%d%d", &in[i].n, &in[i].m);}unit = sqrt(num);sort(in, in + num, [](node q, node w) {if (q.n / unit == w.n / unit)return q.m < w.m;return q.n < w.n;});int a = 0, b = -1;ll res = 0;for (int i = 0; i < num; i++){while (a < in[i].n){res = (res * 2 - comb(a, b) + mod) % mod;a++;}while (a > in[i].n){res = ((res + comb(a - 1, b)) % mod * inv2) % mod;a--;}while (b < in[i].m){res = (res + comb(a, b + 1)) % mod;b++;}while (b > in[i].m){res = (res - comb(a, b) + mod) % mod;b--;}ans[in[i].index] = res * power(inv2, in[i].n) % mod;}for (int i = 0; i < num; i++)printf("%lld\n", ans[i]);
}
D、数列求和(嘤雄难度) J、滑稽树下你和我 I、滑稽树上滑稽果相关推荐
- 滑稽树下你和我Average distance(树形dp求任意两点距离之和)
滑稽树下你和我. 链接:https://ac.nowcoder.com/acm/contest/992/J 来源:牛客网 题目描述 红红和蓝蓝是随机降生在苹果树上的苹果仙灵,现在红线仙想估测他们的CP ...
- 吉首大学2019年程序设计竞赛(重现赛) J 滑稽树下你和我 (递归)
链接:https://ac.nowcoder.com/acm/contest/992/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...
- 滑稽树下你和我(树+贡献)
链接:https://ac.nowcoder.com/acm/contest/992/J?&headNav=acm 来源:牛客网 题目描述 红红和蓝蓝是随机降生在苹果树上的苹果仙灵,现在红线仙 ...
- 浙江大学 PTA 程序 第四部分 给定精度的简单交错序列部分和 数字游戏 e的近似值 最小值 统计素数并求和 奇数和 幂级数展开的部分和 分数序列前N项和 特殊a串数列求和 换硬币 水仙花数 最大公约
练习4-3 求给定精度的简单交错序列部分和 (15 分) 本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一项的绝对值不大于给定精度eps. 输入格式: ...
- 7-38 数列求和-加强版(20 分)
7-38 数列求和-加强版(20 分) 给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S=A+AA+AAA+⋯+AA⋯A(N个A).例如A=1, N=3时,S=1+11+ ...
- 第六章第十三题(数列求和)(Sum series)
*6.13(数列求和)编写一个方法对下面的数列求和: 编写一个测试程序,显示下面的表格: i m(i) ----------------------- ...
- 高考数学试题数列求和|附习题
很多同学抱怨平时花费大量时间,但数学成绩不见提升,该学了也学了,可是一考试发现还是不会做,其实在数学学习上方法很重要,做题方法对了,其实数学必不难学. 今天,肖老师给同学们整理了高考必考的数列方面的内 ...
- 韩信点兵--求分数序列前N项和--特殊a串数列求和--猜数字游戏
实验4-1-5 韩信点兵 (10分) 在中国数学史上,广泛流传着一个"韩信点兵"的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳.据说韩信的数学水平 ...
- 用生成函数法解决数列求和问题
文章目录 写在前面 问题 求解 写在前面 组合数学的一种重要思想就是生成函数(generation function,也叫母函数),前面介绍过了第一二类Stirling数的生成函数的计算,有兴趣的朋友 ...
最新文章
- datagirdview跟据内容自动适应单元格大小
- PartitionStateMachine分析
- Java设计模式05:常用设计模式之原型模式(创建型模式)
- C#笔记03 运算符和分支结构
- Windows的图形设备接口(GDI)入门 上篇
- 手机html5顶部返回上一页,手机端网页返回顶部js代码
- 实验九 哈希表的查找操作
- 5月14日社区技术直播【Analytics Zoo上的分布式TensorFlow训练AI玩FIFA足球游戏】
- 投身开源,需要持之以恒的热爱与贡献 —— Apache Spark Committer 姜逸坤
- CentOS7 安装php7.4
- 电机仿真系列-基于LabVIEW的电机测试系统研究
- c语言---指针结构体篇
- 服务器防火墙怎么关闭?
- 47个经典java程序编程题
- CSS 背景(background)
- dedecms织梦快照被挟持和篡改入侵漏洞修复
- http请求中必须具备哪个字段_HTTP访问控制(CORS)
- linux_安装启动talnet相关问题
- 计算机存储单位及换算
- 卡尔曼滤波器公式推导