CF976-F. Count Leaves-min25筛(红温了)

news/2024/9/30 3:20:12

link:https://codeforces.com/contest/2020/problem/F
题意:给定 \(n,d,k\),用如下方式构造树\(T_{n,d}\)

  • 树的根是一个标有数字 \(n\) 的节点。这是树的第 \(0\) 层。
  • 对于从 \(0\) 到 \(d−1\) 的每个 \(i\) ,对于第 \(i\) 层的每个顶点,执行以下操作:如果当前顶点标记为 \(x\) ,创建其子顶点并标记为 \(x\) 的所有可能的不同因此 。这些子顶点将位于 \((i+1)\) 层。
  • \(d\) 层上的顶点就是树的叶子。
    \(f(n,d)\) 表示 \(T_{n,d}\) 的叶子结点个数,求 \(\sum_{i=1}^n f(i^k,d)\)\(1\leq n\leq 10^9,1\leq k,d\leq 10^5\).

(喜欢赛后过题)

显然 \(f(n,d)\) 对于固定的 \(d\),是关于 \(n\) 的积性函数(相当于一直做Dirichlet前缀和),考虑 \(f(p^q,d)\),每一层往下相当于做一个前缀和,答案是 \(\frac{1}{(1-x)^{q+1}}\)\([x^d]\) 的系数,广义二项式定理展开是 \(\binom{d+q}{d}\),那么对于 \(f(p^{kq},d)\) 就是 \(\binom{kq+d}{d}\),那么现在要求这个东西的前缀和,感觉没什么好的办法,直接上一个min25筛:

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define fastio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
constexpr int MOD=1e9+7;
constexpr int N=3e6+5;
int ksm(int a,int b){int ret=1;a%=MOD;for(;b;b>>=1,a=(ll)a*a%MOD)if(b&1)ret=(ll)ret*a%MOD;return ret;
}
int inv(int x){return ksm(x,MOD-2);}
int fact[N],inv_fact[N];
void init(){fact[0]=1;rep(i,1,N-1)fact[i]=(ll)fact[i-1]*i%MOD;inv_fact[N-1]=inv(fact[N-1]);for(int i=N-1;i>=1;i--)inv_fact[i-1]=(ll)inv_fact[i]*i%MOD;
}
int C(int n,int k){if(k>n)return 0;return (ll)fact[n]*inv_fact[k]%MOD*inv_fact[n-k]%MOD;
}
namespace Min25{  constexpr int maxs=2e5;void add(int &x,const int & y){x+=y;if(x>=MOD)x-=MOD;}void dec(int &x,const int & y){x+=MOD-y;if(x>=MOD)x-=MOD;}int sum(const int &x,const int & y){return x+y<MOD?x+y:(x+y-MOD);}int sub(const int &x,const int & y){return x<y?x+MOD-y:x-y;}template<typename T>long long sqrll(const T&x){return (ll)x*x;}long long global_n,lis[maxs + 1];int K,d;int pri[maxs / 7], lpf[maxs + 1], spri[maxs + 1],pcnt,lim,cnt;int le[maxs + 1],ge[maxs + 1];//x<=sqrt(n),x>sqrt(n)int G[maxs + 1][2], Fprime[maxs + 1];#define idx(v) (v <= lim ? le[v] : ge[global_n / v])void sieve(const int &n) {rep(i,2,n){if(!lpf[i]){lpf[i]=++pcnt;pri[lpf[i]]=i;spri[pcnt]=sum(spri[pcnt-1],1);//}for(int j=1,v;j<=lpf[i];j++){v=i*pri[j];if(v>n)break;lpf[v]=j;}}}void init(const int &n,int _k,int _d){//calc Fprimeglobal_n=n;K=_k;d=_d;cnt=0;for(ll i=1,j,v;i<=n;i=n/j+1){j=n/i;v=j%MOD;lis[++cnt]=j;(j<=lim?le[j]:ge[n/j])=cnt;G[cnt][0]=sub(v,1ll);//}rep(k,1,pcnt){const int p=pri[k];const ll sqrp=sqrll(p);for(int i=1;lis[i]>=sqrp;i++){const ll v=lis[i]/p;const int id=idx(v);dec(G[i][0],sub(G[id][0],k-1));}}rep(i,1,cnt)Fprime[i]=(ll)G[i][0]*C(K+d,d)%MOD;//}int fp(const int &p,const int &c){return C(c*K+d,d);}//int F(const int &k,const ll &n){if(pri[k]>n||n<=1)return 0;const int id=idx(n);int ans=sub(Fprime[id],(ll)spri[k-1]*C(K+d,d)%MOD);//for(int i=k;i<=pcnt&&sqrll(pri[i])<=n;i++){long long pw=pri[i],pw2=sqrll(pw);for(int c=1;pw2<=n;c++,pw=pw2,pw2*=pri[i])add(ans,((ll)fp(pri[i],c)*F(i+1,n/pw)+fp(pri[i],c+1))%MOD);}return ans;}
}int main(){fastio;int tc;cin>>tc;init();Min25::lim=sqrt(1e9);Min25::sieve(Min25::lim+1000);while(tc--){int n,k,d;cin>>n>>k>>d;Min25::init(n,k,d);cout<<(Min25::F(1,n)+1)%MOD<<endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/66383.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

重命名工具 Bulk Rename Utility v4.0.0.0 中文版

​重命名工具 Bulk Rename Utility v4.0.0.0 中文版 下载地址;https://pan.quark.cn/s/67fba8bda394 介绍 当发现做一件事情,原本用工具或软件进行批量处理也能达到相同效果,可却花了数倍的时间去处理的时候,会很讨厌自己的愚蠢。当你在电脑上做某个操作时,如果觉得可能会…

开源免费 PDF 工具集 | Stirling-PDF v0.29.0

开源免费 PDF 工具集 | Stirling-PDF v0.29.0 下载地址:https://pan.quark.cn/s/f02c1b332928 介绍 这是一款使用 Docker 的基于本地托管网络的强大 PDF 操作工具。它能让你在 PDF 文件上执行各种操作,包括分割、合并、转换、重组、添加图像、旋转、压缩等。这款本地托管的网络…

jenkins--为普通用户授予指定job权限

安装Role-based Authorization Strategy 插件 我们采用RBAC 基于角色的方式进行授权,需要在jenkins上安装插件,在Jenkins的Manage Jenkins→Plugins→Available Plugins 中安装之后在Jenkins的Manage Jenkins→Security 中开启基于角色的权限策略。然后在jenkins的配置栏里就…

【CodeForces训练记录】Codeforces Round 976 (Div. 2) and Divide By Zero 9.0

https://codeforces.com/contest/2020赛后反思 没有捏,尽力了 A题 给定 \(n,k\) 每次都可以将 \(n\) 减去 \(k\) 的任意次方,想要次数最少,我们显然使用贪心,每次尽可能减去最大,但我们倒过来想,\(k^{x_1}+k^{x_2}+k^{x_3} \cdots = n\) 这东东不就是将 \(n\) 转成 \(k\)…

RocketMQ Offset管理

## Offset管理 ### 1. **Offset 的定义** - **Offset** 表示某个消息在消息队列中的位置。通过 `Offset`,可以准确地找到该消息或者从这个位置开始继续消费消息。- **maxOffset** 表示消息队列中的最大偏移量,是最新消息的 `Offset + 1`。- **minOffset** 是当前消息队列中的…

随书光盘下载使用方法

https://zhujiang.tjufe.edu.cn/tsg/2023/0620/c146a23515/page.htm随书光盘下载使用方法发布时间:2023-06-20浏览次数:3053一、网址访问 1.进入访问链接http://discx.yuntu.io,打开联图云光盘页面(需连接校园网)。 2.在搜索栏输入要搜索的图书isbn或书名。 3.在线使用光…

加入极限科技(INFINI Labs),成为搜索运维工程师!

我们是国内搜索型数据库产品厂商第一梯队的杰出代表,随着业务的快速发展,现开放岗位:搜索运维工程师( Elasticsearch/Easysearch ),如果有兴趣,请直接拉到文末,扫描二维码或将简历投递至 hello@infini.ltd。 如果您还不了解 极限科技(INFINI Labs)是谁,在做什么,需…

Vscode配置Python环境 Pytorch模块和sklearn模块的下载

Vscode配置Python环境 && Pytorch和sklearn模块安装教程 1.下载python解释器首先在python官网下一个Python解释器点击如下的就可以下载了2.python解释器安装 安装过程如下:双击exe文件安装安装成功3.下载VscodeVisual Studio 官网4.配置Vscode点击Vscode来到这个界面V…