2021.10.12考试总结[NOIP模拟75]
T1 如何优雅的送分
考虑式子的实际意义。\(2^{f_n}\)实际上就是枚举\(n\)质因子的子集。令\(k\)为这个子集中数的乘积,就可以将式子转化为枚举\(k\),计算\(k\)的贡献。
不难得出\(k\)一定没有平方因子,那么枚举\(k\)就可以写为枚举\(\left \{ \mu^2(d)|d\in N^* \right \}\),即:
\]
发现有\(\mu^2(d)=\sum_{k^2|d}\mu(k)\),证明时考虑\(d\)有几个平方因子。当没有时,\(k\)只能取\(1\)。否则令\(x\)为它的平方因子个数,有:
\]
发现它就是个二项式定理,即\((-1+1)^x=0\)。于是等式成立。
于是接下来一波合适变换整成整除分块的形式,求答案即可。
\sum_{i=1}^n2^{f_i} &=\sum_{i=1}^n\sum_{d|i}\mu^2(d)
\\ &=\sum_{i=1}^n\sum_{d|i}\sum_{k^2|d}\mu(k)
\\ &=\sum_{k=1}^n\sum_{k^2|d}\left\lfloor \frac{n}{d} \right\rfloor
\\ &=\sum_{k=1}^n\mu(k)\sum_{i=1}^{\left\lfloor\frac{n}{k^2}\right\rfloor}\left\lfloor\frac{n}{k^2i}\right\rfloor
\\ &=\sum_{k=1}^n\mu(k)S(\left\lfloor\frac{n}{k^2}\right\rfloor)
\end{aligned}
\]
其中\(S(n)=\sum_{i=1}^n\left\lfloor\frac{n}{i}\right\rfloor\),枚举\(k\),整除分块求\(S\)即可。时间复杂度\(\Theta(\sqrt n \ln n)\)。
数学题题解写着真累
\(code:\)
T1
#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace IO{
typedef long long LL;
auto read=[]()->int{
char ch=getchar(); int x=0,f=1;
while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
return x*f;
};
auto write=[](LL x,int sp)->void{
char ch[20]; int len=0;
if(x<0){ x=~x+1; putchar('-'); }
do{ ch[len++]=(1<<4)+(1<<5)+x%10; x/=10; }while(x);
for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
};
auto ckmax=[](int& x,int y)->void{ x=x<y?y:x; };
auto ckmin=[](int& x,int y)->void{ x=x<y?x:y; };
} using namespace IO;
const int p=1e9+7;
int n,ext,ans,cnt,pri[1000010],mu[1000010];
bool vis[1000010];
void get(){
mu[1]=1;
for(int i=2;i<=ext;i++){
if(!vis[i]) pri[++cnt]=i, mu[i]=-1;
for(int j=1;j<=cnt&&pri[j]*i<=ext;j++){
vis[pri[j]*i]=1;
if(!(i%pri[j])) break;
mu[pri[j]*i]=-mu[i];
}
}
}
int calc(int N){
int l=1,r,res=0;
while(l<=N){
r=N/(N/l);
(res+=(N/l)*(r-l+1))%=p;
l=r+1;
}
return res;
}
signed main(){
freopen("elegant.in","r",stdin);
freopen("elegant.out","w",stdout);
n=read(); ext=sqrt(n); get();
for(int i=1;i<=ext;i++)
(ans+=p+mu[i]*calc(n/(i*i)))%=p;
return write(ans,'\n'),0;
}
T2 阴阳
\(set\)大暴力,记黑点。显然被卡了,正解太神仙,暴力没啥意思,不放代码了。
T3 你猜是不是找规律
令\(f_{i,j}\)为长度为\(i\)的排列,最少交换\(j\)次合法的方案数。转移时考虑新一个数是否放在最后,有
\]
非常感性地发现\(f_{n,k}\)为关于\(n\)的\(2k-1\)次多项式,答案,即\(\sum_{i=0}^k f_{n,i}\),为关于\(n\)的\(2k\)次多项式。拉格朗日插值即可。
\(code:\)
T3
#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace IO{
typedef long long LL;
auto read=[]()->int{
char ch=getchar(); int x=0,f=1;
while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
return x*f;
};
auto write=[](LL x,int sp)->void{
char ch[20]; int len=0;
if(x<0){ x=~x+1; putchar('-'); }
do{ ch[len++]=(1<<4)+(1<<5)+x%10; x/=10; }while(x);
for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
};
auto ckmax=[](int& x,int y)->void{ x=x<y?y:x; };
auto ckmin=[](int& x,int y)->void{ x=x<y?x:y; };
} using namespace IO;
const int NN=3010,p=1e9+7;
int n,k,ans,f[NN];
int x[NN<<1],y[NN<<1];
int qpow(int a,int b){
int res=1;
while(b){
if(b&1) res=res*a%p;
a=a*a%p;
b>>=1;
}
return res;
}
inline int langrange(int num,int xx){
int res=0; xx%=p;
for(int i=1;i<=num;i++){
int s1=y[i]%p,s2=1;
for(int j=1;j<=num;j++)
if(i!=j) s1=s1*(xx-x[j]+p)%p, s2=s2*(x[i]-x[j]+p)%p;
(res+=s1*qpow(s2,p-2)%p)%=p;
}
return res;
}
signed main(){
freopen("guess.in","r",stdin);
freopen("guess.out","w",stdout);
n=read(); k=read();
x[1]=1; y[1]=1; f[0]=1;
for(int i=2;i<=2*k+1;i++){
x[i]=i;
for(int j=k;j;j--) (f[j]+=(i-1)*f[j-1])%=p;
for(int j=0;j<=k;j++) (y[i]+=f[j])%=p;
}
return write(langrange(2*k+1,n),'\n'),0;
}
T4 小说
题解说得很清楚。

\(01\)退背包:记\(f\)为原\(01\)背包方案数,\(g\)为强制第\(i\)件物品不选的方案数。有
\]
\(code:\)
T4
#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace IO{
typedef long long LL;
auto read=[]()->int{
char ch=getchar(); int x=0,f=1;
while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
return x*f;
};
auto write=[](LL x,int sp)->void{
char ch[20]; int len=0;
if(x<0){ x=~x+1; putchar('-'); }
do{ ch[len++]=(1<<4)+(1<<5)+x%10; x/=10; }while(x);
for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
};
auto ckmax=[](int& x,int y)->void{ x=x<y?y:x; };
auto ckmin=[](int& x,int y)->void{ x=x<y?x:y; };
} using namespace IO;
const int NN=110,WW=1401000,p=998244353;
int n,mx,pos,ans,sum,tot,v[NN];
int f[WW],g[WW];
void work(int I){
int res=0;
memset(g,0,sizeof(g)); g[0]=1;
for(int i=1;i<=sum;i++)
if(i<v[I]) g[i]=f[i];
else g[i]=(f[i]-g[i-v[I]]+p)%p;
for(int i=1;i<=sum;i++)
res+=(bool)g[i];
if(res>mx) mx=res,pos=I;
}
signed main(){
freopen("novel.in","r",stdin);
freopen("novel.out","w",stdout);
n=read(); f[0]=1;
for(int i=1;i<=n;i++)
sum+=(v[i]=read());
sort(v+1,v+n+1);
for(int i=1;i<=n;i++)
for(int j=sum;j>=v[i];j--)
(f[j]+=f[j-v[i]])%=p;
for(int i=1;i<=n;i++) work(i);
tot=sum-v[pos]; write(v[pos],' ');
memset(f,0,sizeof(f)); f[tot]=1;
for(int i=1;i<=n;i++) if(i!=pos){
for(int j=tot+tot;j>=v[i];j--)
f[j]|=f[j-v[i]];
for(int j=0;j<=tot+tot-v[i];j++)
f[j]|=f[j+v[i]];
}
for(int i=1;i<=tot;i++)
if(!f[i+tot]) return write(i,'\n'),0;
return write(tot+1,'\n'),0;
}
2021.10.12考试总结[NOIP模拟75]的更多相关文章
- 2021.9.12考试总结[NOIP模拟51]
T1 茅山道术 仔细观察发现对于每个点只考虑它前面第一个与它颜色相同的点即可. 又仔细观察发现对一段区间染色后以这个区间内点为端点的区间不能染色. 于是对区间右端点而言,区间染色的贡献为遍历到区间左端 ...
- 2021.8.12考试总结[NOIP模拟37]
T1 数列 考场上切掉的简单题. $a$,$b$与数列中数的正负值对答案无关.全当作正数计算即可. $exgcd$解未知数系数为$a$,$b$,加和为$gcd(a,b)$的不定方程组,再枚举每个数.如 ...
- 2021.10.7考试总结[NOIP模拟71]
信心赛,但炸了.T3SB错直接炸飞,T4可以硬算的组合数非要分段打表求阶乘..T2也因为一个细节浪费了大量时间.. 会做难题很好,但首先还是要先把能拿的分都拿到. T1 签到题 结论:总可以做到对每个 ...
- 2021.10.15考试总结[NOIP模拟77]
\(n=40\)考虑\(meet \;in \;the \;middle\) 某个元素有关的量只有一个时考虑转化为树上问题 对暴力有自信,相信数据有梯度 没了 UPD:写了个略说人话的. T1 最大或 ...
- 2021.10.18考试总结[NOIP模拟76]
T1 洛希极限 不难发现每个点肯定是被它上一行或上一列的点转移.可以预处理出每个点上一行,上一列最远的能转移到它的点,然后单调队列优化. 预处理稍显ex.可以用并查集维护一个链表,记录当前点之后第一个 ...
- 2021.10.11考试总结[NOIP模拟74]
T1 自然数 发现\(mex\)是单调不降的,很自然地想到用线段树维护区间端点的贡献. 枚举左端点,用线段树维护每个右端点形成区间的\(mex\)值.每次左端点右移相当于删去一个数. 记\(a_i\) ...
- 2021.10.9考试总结[NOIP模拟72]
T1出了个大阴间题 状压\(DP\),记当前状态的代价和与方案数.状态\(\Theta(2^nn)\),转移\(\Theta(n)\). 发现每个状态的最大值只会是所选集合的\(max\)或加一.于是 ...
- 2021.9.17考试总结[NOIP模拟55]
有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...
- 2021.6.29考试总结[NOIP模拟10]
T1 入阵曲 二位前缀和暴力n4可以拿60. 观察到维护前缀和时模k意义下余数一样的前缀和相减后一定被k整除,前缀和维护模数,n2枚举行数,n枚举列, 开一个桶记录模数出现个数,每枚举到该模数就加上它 ...
随机推荐
- (三、四)Superset 1.3图表篇——透视表-Pivot Table
本系列文章基于Superset 1.3.0版本.1.3.0版本目前支持分布,趋势,地理等等类型共59张图表.本次1.3版本的更新图表有了一些新的变化,而之前也一直没有做过非常细致的图表教程. 而且目前 ...
- Windows Server 2022 OVF(SLIC 2.6)
请访问原文链接:https://sysin.org/blog/windows-server-2022-ovf/,查看最新版.原创作品,转载请保留出处. 作者:gc(at)sysin.org,主页:ww ...
- python中模块与包
#模块与包#在实际项目中,代码的行数可能上万,甚至上几十万,不可能在一个页面内完成,需要多个程序员通力写作#张三,李四,王五......每天收集大家的代码做一个版本,类似乐高积木一样,每个人负责一部分 ...
- Django学习day06随堂笔记
每日测验 """ 今日考题 1.什么是FBV与CBV,能不能试着解释一下CBV的运作原理 2.模版语法的传值需要注意什么,常见过滤器及标签有哪些 3.自定义过滤器,标签, ...
- supermvc介绍
马上要开始写毕设了,需要一个合适的框架.想想自己用过的几个框框speedphp tp啊 还有公司的 dagger啊 ,大同小易.每一种都有自己喜欢的地方.然后想到了二八理论,我们常用的功能可能不到框架 ...
- Thinkphp5 主动式 计划任务 支持windows和linux
百度搜索过相关的php计划任务的资料,特别是搜索thinkphp的计划任务,目前能明确实现的都是被动式的,就是通过tp3.2自带的计划任务类实现,通过挂钩子的形式,用户访问网站的时候就执行计划任务,这 ...
- 安装VM-TOOLS,解压tar包时提示目录磁盘空间不足
在虚拟机里安装了ubuntu-18.04.4-desktop-amd64,安装VM-TOOLS,解压tar包时提示目录磁盘空间不足. 解决方法一: 打开terminal,输入:sudo apt ins ...
- django 各项配置基本设置
setting中一些设置例子 mysql数据库连接设置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': ...
- 深入浅出WPF-08.Event( 事件)02
路由事件 为了方便程序中对象之间的通信常常需要我们定义一些路由事件.使用路由事件比直接事件方便得多. 创建自定义路由事件的步骤: 1)声明并注册路由 2)为路由事件添加CLR事件包装 3)创建可以激发 ...
- 设置 SSH 命令行空闲保持会话
楔子 使用 Mac 或 Linux 原生的命令行 ssh user@ip 方式连接 Linux 闲时会自动断开终端卡死. 为解决这个问题,查了到篇博客翻译下关键步骤记录下来.解决方式可以分服务端设置和 ...