vjudge数学专题1
挑了几道可做的做了,难度大概升序排序
F New Year and Arbitrary Arrangement
New Year and Arbitrary Arrangement
期望dp,考虑逆推。
考虑设
有
目标要设为为
考虑边界,容易发现当
考虑如何求
记
然后这道题用记搜就做完了。
点此查看代码
#include<bits/stdc++.h> #include<bits/extc++.h> // using namespace __gnu_pbds; // using namespace __gnu_cxx; using namespace std; #define InF(x) freopen(x".in","r",stdin) #define OutF(x) freopen(x".out","w",stdout) #define ErrF(x) freopen(x".err","w",stderr) #define AnsF(x) freopen(x".ans","w",stdout) #define rep(i,s,t,p) for(int i = s;i <= t; i += p) #define drep(i,s,t,p) for(int i = s;i >= t; i -= p) #ifdef LOCAL FILE *InFile = InF("in"),*OutFile = OutF("out"); // FILE *ErrFile = ErrF("err"); #else FILE *Infile = stdin,*OutFile = stdout; //FILE *ErrFile = stderr; #endif using ll=long long;using ull=unsigned long long; using db = double;using ldb = long double; const int N = 1e3 + 10,mod = 1e9 + 7; inline int power(int a,int b,int mod){ int res = 1; for(;b;b >>= 1,a = 1ll*a*a%mod) if(b&1) res = 1ll*res*a%mod; return res; } int k,pa,pb,inv,inv1,inv2,inv3,f[N][N]; bool vis[N][N]; int dp(int x,int y){ if(x + y >= k) return (x+y+inv3)%mod; if(vis[x][y]) return f[x][y]; vis[x][y] = true; int res = 0; res = (res + 1ll*dp(x+1,y)*inv1%mod)%mod; res = (res + 1ll*dp(x,x+y)*inv2%mod)%mod; return f[x][y] = res; } signed main(){ cin.tie(nullptr)->sync_with_stdio(false); cout.tie(nullptr)->sync_with_stdio(false); cin>>k>>pa>>pb; inv = power(pa+pb,mod-2,mod); inv1 = 1ll*pa*inv%mod,inv2 = 1ll*pb*inv%mod,inv3 = 1ll*pa*power(pb,mod-2,mod)%mod; cout<<dp(1,0); }
E - Steps to One
由于个人习惯,以下的
设
显然有
转移方程为
考虑优化
看到了
所以就有了
再考虑把整个柿子当成一个以
然后设
更新
至于
复杂度
点此查看代码
#include<bits/stdc++.h> #include<bits/extc++.h> // using namespace __gnu_pbds; // using namespace __gnu_cxx; using namespace std; #define InF(x) freopen(x".in","r",stdin) #define OutF(x) freopen(x".out","w",stdout) #define ErrF(x) freopen(x".err","w",stderr) #define AnsF(x) freopen(x".ans","w",stdout) #define rep(i,s,t,p) for(int i = s;i <= t; i += p) #define drep(i,s,t,p) for(int i = s;i >= t; i -= p) #ifdef LOCAL FILE *InFile = InF("in"),*OutFile = OutF("out"); // FILE *ErrFile = ErrF("err"); #else FILE *Infile = stdin,*OutFile = stdout; //FILE *ErrFile = stderr; #endif using ll=long long;using ull=unsigned long long; using db = double;using ldb = long double; const int N = 1e5 + 10,mod = 1e9 + 7; #define eb emplace_back inline int power(int a,int b,int mod){ int res = 1; for(;b;b >>= 1,a = 1ll*a*a%mod) if(b&1) res = 1ll*res*a%mod; return res; } int n,f[N],dp[N],mu[N],inv[N]; bitset<N> pd; vector<int> prime,fac[N]; inline void get_mu(int n){ mu[1] = 1; for(int i = 2;i <= n; ++i){ if(!pd[i]) prime.eb(i),mu[i] = -1; for(int j:prime){ if(i * j > n) break; pd[i*j] = true; if(i%j == 0) break; mu[i*j] = -mu[i]; } } } inline void solve(){ cin>>n;get_mu(n); rep(i,1,n,1) rep(j,i,n,i) fac[j].eb(i); rep(i,1,n,1) inv[i] = power(i,mod-2,mod); rep(i,1,n,1){ f[i] = n; for(int T:fac[i]) f[i] = (f[i] + 1ll*(n/T)%mod*dp[T]%mod + mod)%mod; f[i] = 1ll*f[i]*power(n-n/i,mod-2,mod)%mod; for(int j = i;j <= n;j += i) dp[j] = (dp[j] + 1ll*f[i]*mu[j/i]%mod + mod)%mod; } int ans = 0; rep(i,1,n,1) ans = (ans + f[i])%mod; ans = 1ll * ans * inv[n]%mod; cout<<(ans+1)%mod; } signed main(){ cin.tie(nullptr)->sync_with_stdio(false); cout.tie(nullptr)->sync_with_stdio(false); solve(); }
持续更新中……
__________________________________________________________________________________________
本文来自博客园,作者:CuFeO4,转载请注明原文链接:https://www.cnblogs.com/hzoi-Cu/p/18468493
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现