前言

先吐槽一下出题人,T2 牛马数据连棵树都不是。。

T3 描述不清楚。。

T1 如何优雅的送分

解题思路

我考场上还真以为是个送分题,然而。。。

莫比乌斯反演。。。

对于一个数字 n 有 \(2^{F(n)}=\sum\limits_{d|n}\mu^2(d)\) ,由于有平方因子的数字的 \(\mu\) 的值是 0 ,就相当于在所有的质因数里面选择若干个质因数组合。

\(\mu^2(n)=\sum\limits_{d^2|n}\mu(d)\) 对于质数的情况是比较显然的,毕竟符合条件的只有 1 。

这个可以理解为枚举质因数的个数算对应的答案。

假设这个数质因数的个数是 \(cnt\) ,那么答案就是 \(\sum\limits_{i=0}^{cnt}(-1)^i\times \binom{cnt}{i}\) 由二项式定理可得上式为 0 。

于是答案就是 \(\displaystyle\sum_{i=1}^n 2^{F(i)}=\sum_{i=1}^n\sum_{d|i}\sum_{k^2|d}\mu(k)\)

更改枚举顺序 \(\displaystyle\sum_{k=1}^n\mu(k)\sum_{k^2|d}\lfloor\frac{n}{d}\rfloor\)

也就是 \(\displaystyle\sum_{k=1}^n\mu(k)\sum_{i=1}^{\lfloor\frac{n}{k^2}\rfloor}\lfloor\frac{n}{k^2i}\rfloor\)

设 \(S(n)=\sum\limits_{i=1}^n\lfloor \frac{n}{i}\rfloor\) 上述柿子就是 \(\sum\limits_{k=1}^n \mu(k)S(\lfloor\frac{n}{k^2}\rfloor)\) 。

对于 \(S\) 的运算可以数论分块 复杂度是 \(\mathcal{O}(\sqrt{n}logn)\)

code

  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define ull unsigned long long
  4. #define f() cout<<"Failed"<<endl
  5. using namespace std;
  6. inline int read()
  7. {
  8. int x=0,f=1;char ch=getchar();
  9. while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
  10. while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  11. return x*f;
  12. }
  13. const int N=1e6+7,mod=1e9+7;
  14. int n,m,ans,cnt,pri[N],mu[N];
  15. bool vis[N];
  16. void Pre_work()
  17. {
  18. mu[1]=1;
  19. for(int i=2;i<=m;i++)
  20. {
  21. if(!vis[i]) pri[++cnt]=i,mu[i]=-1;
  22. for(int j=1;j<=cnt&&pri[j]*i<=m;j++)
  23. {
  24. int temp=i*pri[j]; vis[temp]=true;
  25. if(i%pri[j]==0){mu[temp]=0;break;}
  26. mu[temp]=-mu[i];
  27. }
  28. }
  29. }
  30. int S(int lim)
  31. {
  32. int sum=0;
  33. for(int l=1,r;l<=lim;l=r+1)
  34. {
  35. r=lim/(lim/l);
  36. sum=(sum+lim/l%mod*(r-l+1)%mod)%mod;
  37. }
  38. return sum;
  39. }
  40. signed main()
  41. {
  42. freopen("elegant.in","r",stdin); freopen("elegant.out","w",stdout);
  43. n=read(); m=sqrt(n)+1; Pre_work();
  44. for(int i=1;i<=n;i++)
  45. {
  46. int temp=S(n/(i*i));
  47. if(!temp) break;
  48. ans=(ans+mu[i]*temp%mod+mod)%mod;
  49. }
  50. printf("%lld",ans);
  51. return 0;
  52. }

T2 阴阳

解题思路

正解不太会,打了个暴力,可能是由于数据水,骗到了 100pts (虽然后来被Hack成了 91pts)

比较好奇的就是出题人的数据怎么造的(原来 n 个点 n-1 条边还可以是有环的森林。。。)

暴力思路比较简洁,我们需要一个可以动态开空间并且支持查找并且删掉某一个值的数据结构,unoedered_set 刚好可以满足我们的需求。

于是我们可以维护每一个版本的所有黑色节点,每次暴扫整个 set 求出答案。

code

  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define ull unsigned long long
  4. #define f() cout<<"Failed"<<endl
  5. using namespace std;
  6. inline int read()
  7. {
  8. int x=0,f=1;char ch=getchar();
  9. while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
  10. while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  11. return x*f;
  12. }
  13. const int N=1e5+10,M=3e3+10,INF=1e9;
  14. int typ,n,m,t,ans,cnt,now,s[N];
  15. int tot=1,head[N],ver[N<<1],nxt[N<<1];
  16. int tim,dfn[N],siz[N],fa[N],son[N],dep[N],topp[N];
  17. unordered_set<int> res[N];
  18. void add_edge(int x,int y)
  19. {
  20. ver[++tot]=y;
  21. nxt[tot]=head[x];
  22. head[x]=tot;
  23. }
  24. void dfs1(int x)
  25. {
  26. siz[x]=1;
  27. for(int i=head[x];i;i=nxt[i])
  28. {
  29. int to=ver[i]; if(siz[to]) continue;
  30. fa[to]=x; dep[to]=dep[x]+1;
  31. dfs1(to); siz[x]+=siz[to];
  32. if(siz[to]>siz[son[x]]) son[x]=to;
  33. }
  34. }
  35. void dfs2(int x,int tp)
  36. {
  37. topp[x]=tp; dfn[x]=++tim;
  38. if(son[x]) dfs2(son[x],tp);
  39. for(int i=head[x];i;i=nxt[i])
  40. if(!dfn[ver[i]])
  41. dfs2(ver[i],ver[i]);
  42. }
  43. int LCA(int x,int y)
  44. {
  45. while(topp[x]^topp[y])
  46. {
  47. if(dep[topp[x]]<dep[topp[y]]) swap(x,y);
  48. x=fa[topp[x]];
  49. }
  50. if(dep[x]>dep[y]) swap(x,y);
  51. return x;
  52. }
  53. int dist(int x,int y){return dep[x]+dep[y]-2*dep[LCA(x,y)];}
  54. signed main()
  55. {
  56. freopen("yygq.in","r",stdin); freopen("yygq.out","w",stdout);
  57. typ=read(); n=read();
  58. for(int i=1,x,y;i<n;i++)
  59. x=read(),y=read(),
  60. add_edge(x,y),add_edge(y,x);
  61. dfs1(1); dfs2(1,1); m=read();
  62. while(m--)
  63. {
  64. int opt,x; opt=read(); x=read()^(typ*ans);
  65. if(opt==1)
  66. {
  67. cnt++; res[cnt]=res[now];
  68. if(res[now].find(x)==res[now].end()) res[cnt].insert(x);
  69. else res[cnt].erase(x); now=cnt; continue;
  70. }
  71. if(opt==2)
  72. {
  73. ans=INF;
  74. for(auto it:res[now]) ans=min(ans,dist(x,it));
  75. printf("%lld\n",ans); continue;
  76. }
  77. now=x;
  78. }
  79. return 0;
  80. }

T3 你猜是不是找规律

解题思路

我还真就以为是个找规律了。。。

出题人描述不清楚,题目认为的有序序列只是一种顺序只能是升序或者只能是降序。

DP 转移 \(f_{i,j}\) 表示对于有序的序列前 i 个数字交换 j 次可以得到的不同序列。

就有方程:\(f_{i,j}=f_{i-1,j}+f_{i-1,j-1}\times(i-1)\) 。

然后发现其实前缀和是一个有 \(2k\) 项的多项式(我也不知道为啥是这个。。),然后直接拉格朗日插值。。

code

  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define ull unsigned long long
  4. #define f() cout<<"Failed"<<endl
  5. using namespace std;
  6. inline int read()
  7. {
  8. int x=0,f=1;char ch=getchar();
  9. while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
  10. while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  11. return x*f;
  12. }
  13. const int N=3e3+10,mod=1e9+7;
  14. int n,m,ans,f[2][N],s[N<<1];
  15. int power(int x,int y,int p=mod)
  16. {
  17. int temp=1;
  18. while(y)
  19. {
  20. if(y&1) temp=temp*x%p;
  21. x=x*x%p; y>>=1;
  22. }
  23. return temp;
  24. }
  25. void solve1()
  26. {
  27. for(int i=1;i<=n;i++)
  28. {
  29. for(int j=0;j<=m;j++) f[i&1][j]=f[(i&1)^1][j];
  30. for(int j=1;j<=min(i,m);j++) f[i&1][j]=(f[i&1][j]+(i-1)*f[(i&1)^1][j-1])%mod;
  31. }
  32. for(int i=0;i<=m;i++) ans=(ans+f[n&1][i])%mod;
  33. printf("%lld",ans); exit(0);
  34. }
  35. signed main()
  36. {
  37. freopen("guess.in","r",stdin); freopen("guess.out","w",stdout);
  38. n=read(); m=read(); f[0][0]=1;
  39. if(n<=3000) solve1();
  40. for(int i=1;i<=2*m+1;i++)
  41. {
  42. for(int j=0;j<=m;j++) f[i&1][j]=f[(i&1)^1][j];
  43. for(int j=1;j<=min(i,m);j++)
  44. f[i&1][j]=(f[i&1][j]+(i-1)*f[(i&1)^1][j-1])%mod;
  45. for(int j=0;j<=m;j++) s[i]=(s[i]+f[i&1][j])%mod;
  46. }
  47. for(int i=1;i<=2*m+1;i++)
  48. {
  49. int temp=1,base=1;
  50. for(int j=1;j<=2*m+1;j++)
  51. if(i!=j)
  52. temp=(n-j+mod)%mod*temp%mod,
  53. base=base*(i-j+mod)%mod;
  54. ans=(ans+s[i]*temp%mod*power(base,mod-2))%mod;
  55. }
  56. printf("%lld",ans);
  57. return 0;
  58. }

T4 小说

解题思路

运用退背包每次枚举退掉的点,选择造成损失比较小的,方案可以在对于大质数取模的意义下考虑。

然后有了这个去掉的物品,接下来我们所选择的 b 不可以被剩下物品 \(v_i,-v_i\) 构成。

对于剩下的物品按上面两个值做一个 01背包,取大于 0 的第一个值作为答案。

code

  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define ull unsigned long long
  4. #define f() cout<<"Failed"<<endl
  5. using namespace std;
  6. inline int read()
  7. {
  8. int x=0,f=1;char ch=getchar();
  9. while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
  10. while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  11. return x*f;
  12. }
  13. const int N=110,M=7e5+10,mod=1e9+7,base=7e5+10;
  14. int n,lim,ans,maxn,id,s[N],f[M],g[M];
  15. bitset<(M<<1)> bit;
  16. signed main()
  17. {
  18. freopen("novel.in","r",stdin); freopen("novel.out","w",stdout);
  19. n=read(); f[0]=1; for(int i=1;i<=n;i++) s[i]=read(),lim+=s[i];
  20. for(int i=1;i<=n;i++)
  21. for(int j=lim;j>=s[i];j--)
  22. f[j]=(f[j]+f[j-s[i]])%mod;
  23. for(int i=1;i<=n;i++)
  24. {
  25. int sum=0;
  26. for(int j=0;j<=lim;j++) g[j]=f[j];
  27. for(int j=s[i];j<=lim;j++) g[j]=(g[j]-g[j-s[i]]+mod)%mod;
  28. for(int j=1;j<=lim;j++) sum+=(g[j]>0);
  29. if(sum>maxn) maxn=sum,id=i;
  30. }
  31. bit[base]=true;
  32. for(int i=1;i<=n;i++) if(i!=id) bit|=bit>>s[i],bit|=bit<<s[i];
  33. for(int i=1;i<=lim+1;i++) if(!bit[i+base]){ans=i;break;}
  34. printf("%lld %lld",s[id],ans);
  35. return 0;
  36. }

NOIP模拟75的更多相关文章

  1. Noip模拟75 2021.10.12

    T1 如何优雅的送分 他说是送分题,我就刚,没刚出来,想到莫比乌斯容斥后就都没推出来 好吧还是不能被恶心的题目,挑衅的语言打乱做题节奏 于是这一场也就没了.... $F(i)$表示$i$的不同质因子集 ...

  2. 2021.10.12考试总结[NOIP模拟75]

    T1 如何优雅的送分 考虑式子的实际意义.\(2^{f_n}\)实际上就是枚举\(n\)质因子的子集.令\(k\)为这个子集中数的乘积,就可以将式子转化为枚举\(k\),计算\(k\)的贡献. 不难得 ...

  3. 2019.7.29 NOIP模拟测试10 反思总结【T2补全】

    这次意外考得不错…但是并没有太多厉害的地方,因为我只是打满了暴力[还没去推T3] 第一题折腾了一个小时,看了看时间先去写第二题了.第二题尝试了半天还是只写了三十分的暴力,然后看到第三题是期望,本能排斥 ...

  4. NOIP模拟17.9.22

    NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥

  5. NOIP 模拟4 T2

    本题属于二和一问题 子问题相互对称 考虑对于问题一:知a求b 那么根据b数组定义式 显然能发现问题在于如何求dis(最短路) 有很多算法可供选择 dijsktra,floyed,bfs/dfs,spf ...

  6. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  7. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  8. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  9. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  10. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

随机推荐

  1. docker 应用篇————docker 网络[十七]

    前言 简单介绍一下docker 网络. 正文 使用ip addr. 可以看到网络. 有一个虚拟网卡: 那么基本上容器就处于这样的模式了. 那么也就是所有容器都在同一网关下面了. 那么问题来了,理论上容 ...

  2. ModelScope初探:一行代码调用成熟AI模型

    简介: 如何用一行代码调用成熟AI模型?试试ModelScope,让AI开发者解放生产力! ModelScope是阿里推出的下一代开源的模型即服务共享平台,为泛AI开发者提供灵活.易用.低成本的一站式 ...

  3. 一文详解SQL关联子查询

    简介: 本文主要介绍什么是关联子查询以及如何将关联子查询改写为普通语义的sql查询. 本文主要介绍什么是关联子查询以及如何将关联子查询改写为普通语义的sql查询. 在背景介绍中我们将讲讲常见的关联子查 ...

  4. Morphling:云原生部署 AI , 如何把降本做到极致?

    ​简介: Morphling 本意是游戏 Dota 中的英雄"水人",他可以根据环境要求,通过灵活改变自身形态,优化战斗表现.我们希望通过 Morphling 项目,实现针对机器学 ...

  5. [FAQ] 阿里云一口价域名购买之后在哪里看

    进入控制台,产品和服务中找到"域名",进去后在左侧菜单有 "已买到的域名". 如图: Link:https://www.cnblogs.com/farwish/ ...

  6. dotnet 写一个支持层层继承属性的对象

    我最近在造一个比 Excel 差得多的表格控件,其中一个需求是属性的继承.大家都知道,表格里面有单元格,单元格里面允许放文本,文本可以放多段文本.本文的主角就是文本段落的样式属性,包括文本字体字号颜色 ...

  7. 使用Kafka Assistant监控Kafka关键指标

    使用Kafka Assistant监控Kafka关键指标 使用Kafka时,我们比较关心下面这些常见指标. Kafka Assistant下载地址:http://www.redisant.cn/ka ...

  8. leaflet 使用turfjs实现前端自定义插值

    Turf.js官网地址:http://turfjs.org/ Turf.js中的几何数据组织规范以WKT格式为标准.其官网中包含了详细的接口介绍和样例讲解.这里我给出我们需要用的接口: 参考地址: h ...

  9. 比Selenium更优秀的playwright介绍与未来展望

    Playwright是微软开发的,专门为满足端到端测试需求而创建的.Playwright支持包括Chromium.WebKit和Firefox在内的所有现代渲染引擎.在Windows.Linux和ma ...

  10. java学习之旅(day.16)

    集合框架 集合 集合:对象的容器,创建的对象就存储在集合中.集合定义了对多个对象进行操作的常用方法,可实现数组的功能 集合和数组的相同点:都是容器 集合和数组的区别: 数组定义后长度固定,集合长度不固 ...