• [考试反思]1010csp-s模拟测试67:摸索


    嗯。。。所谓RP守恒?

    仍然延续着好一场烂一场的规律。

    虽说我也想打破这个规律,但是并不想在考烂之后打破这个规律。(因为下一场要考好???)

    我也不知道我现在是什么状态,相较于前一阶段有所提升(第一鸡房的buff?)

    但是明显还有提升空间。也可以看到离上面的差距有多大。

    (在去食堂的路上一顿爆捶捶傻skyh就能进步一名了hhh)

    这场考试呢,T1正路是推式子然而我又开始疯狂打表找规律,最后得到了一个和正解没什么关系但是能拿到80分的式子。

    也肝了一个小时,然后就停止在80分了。

    并不是没有在化式子,而是化的不彻底,没有到最终可做的形式。

    然后T2是个板子就写了。没调没对拍,着急进T3。(又不像某些人考前打对拍。。。)

    T3想直接奔着最终答案去,于是就先上了个暴力,对着excel看了挺久,找到一些规律但是不能用于做题。

    最后20分钟左右的时候想到了n3的思路,但是细节较多来不及打了,时间分配不够。还是给T3分的时间不够多。

    最后交了暴力。最后几分钟打了21~25的表但是没有数据,数据是28。如果提前几分钟开始打就多20分了。。。

    然后就没有然后了。

    还好,仍然是在持续的思考。没挂机没摸鱼。

    但是某些考试技巧还是要练的。。。如打表之类。。。

    不要尝试找n2的表的规律,很困难而且浪费时间。

    分配一些时间给打表交表也是不错的。

    T1:神炎皇

    考场上的发现是$- n +sum limits_{i=1}^{n} sqrt{i的最大平方因子}$

    枚举这个因子,此后就不应再有平方因子,运用莫比乌斯函数的实际意义进行容斥,得到

    $= - n + sum limits_{d=1}^{sqrt{n}} d sum limits _{k=1}^{left lfloor frac{n}{d^2} ight floor} mu (k) imes left lfloor frac{n}{d^2 k^2} ight floor$

    这样的式子的复杂度外层是$sqrt{n}$,内层是调和级数,所以总的复杂度是$O( sqrt{n} ln sqrt{n} )$,有80分。

    而正解是考虑ab的最大公约数,设$gcd(i,j)=g$,$a=gx$,$b=gy$

    那么有$xyg^2 mod (x+y)g =0$。因为xy互质,所以xy与x+y互质

    所以$g mod (x+y) =0 $,所以$g>=x+y$。那么根据题目的限制$a+b<=n$则$(x+y)g<=n$

    有$x+y<=n$。那么就枚举$k=x+y$。求数对$x,y$的数量。

    因为$y$与$x$互质,所以$x+y$与$x$互质,所以确定$k$后可行的$x$就有$varphi (k)$个。

    然后可行的$g$的个数就是$frac{n}{k^2}$个。

    那么最终的答案就是$sum limits_{k=1}^{sqrt{n}} varphi (k) imes frac{n}{k^2}$

    最终复杂度$ O( sqrt{n} ) $

     1 #include<cstdio>
     2 int phi[10000005],p[10000005],pcnt;char np[10000005];long long n,ans;
     3 int main(){
     4     for(int i=2;i<=10000000;++i){
     5         if(!np[i])p[++pcnt]=i,phi[i]=i-1;
     6         for(int j=1;j<=pcnt&&i*p[j]<=10000000;++j)
     7             if(i%p[j])phi[i*p[j]]=phi[i]*(p[j]-1),np[i*p[j]]=1;
     8             else {phi[i*p[j]]=phi[i]*p[j],np[i*p[j]]=1;break;}
     9     }
    10     scanf("%lld",&n);
    11     for(long long i=1;i*i<=n;++i)ans+=n/i/i*phi[i];
    12     printf("%lld
    ",ans);
    13 }
    View Code

    T2:降雷皇

    一个比较普通的线段树dp,只不过记录了一下方案。

    算是个板子吧。

     1 #include<cstdio>
     2 #define mod 123456789
     3 int Mod(int p){return p>=mod?p-mod:p;}
     4 struct state{
     5     int dp,pl;
     6     friend state operator+(state x,state y){
     7         if(x.dp<y.dp)return y;
     8         if(y.dp<x.dp)return x;
     9         return (state){x.dp,Mod(x.pl+y.pl)};
    10     }
    11 }w[800005],O;
    12 int cl[800005],cr[800005],x[800005];
    13 void build(int p,int l,int r){
    14     cl[p]=l;cr[p]=r;
    15     if(l==r){w[p]=(state){0,l?0:1};return;}
    16     build(p<<1,l,l+r>>1);build(p<<1|1,(l+r>>1)+1,r);
    17     w[p]=w[p<<1]+w[p<<1|1];
    18 }
    19 void chg(int p,int pos,state nw){
    20     if(cl[p]==cr[p]){w[p]=w[p]+nw;return;}
    21     chg(pos<=cl[p]+cr[p]>>1?p<<1:p<<1|1,pos,nw);
    22     w[p]=w[p<<1]+w[p<<1|1];
    23 }
    24 state ask(int p,int l,int r){
    25     if(l<=cl[p]&&cr[p]<=r)return w[p];
    26     return ask(p<<1,l,r)+(r>=cl[p<<1|1]?ask(p<<1|1,l,r):O);
    27 }
    28 int main(){
    29     int n,opt,x;scanf("%d%d",&n,&opt);
    30     build(1,0,100000);
    31     while(n--){
    32         scanf("%d",&x);
    33         state bst=ask(1,0,x-1);bst.dp++;
    34         chg(1,x,bst);
    35     }
    36     state ans=ask(1,0,100000);
    37     printf("%d
    ",ans.dp);
    38     if(opt==1)printf("%d
    ",ans.pl);
    39 }
    View Code

    T3:幻魔皇

    斐波那契树当然离不开斐波那契数列。还记得那个兔子的例子?

    白点是小兔子,黑点是老兔子。

    在相同时间年龄相同的兔子,其子树完全相同。

    既然要求树上的距离,那么肯定是要知道最近公共祖先的。

    如果两个白点存在祖先关系那么它们的祖先就是老的那一个白点,否则就是一个黑点。

    那么考虑枚举每一个点,考虑它为lca时子数的贡献。

    如果是个白点,那么其对距离为i的点对的贡献就是它第i代后代中白点的数量,就是fib[i]。

    (具体是fib的第几项可能因人而异,因为我的fib[0]=1,fib[1]=0)

    然后枚举每一层的全部白点,它们的数量也就是个fib数,n2解决所有祖先关系的白点对的贡献。

    如果lca是黑点,那么黑点有一个黑儿子一个白儿子,lca是它的话那么两个白点要分别在两个子数内。

    处理层数为1的,答案为0。

    不断考虑层数更高的,其新的贡献就是白儿子的新的一层与原有黑儿子的贡献,以及黑儿子新的一层与新的白儿子的贡献。

    具体就是一大堆的fib数。处理出f[i][j]表示深度为i的黑根树对答案j的贡献,乘上整棵树里有多少个这样的黑点即可。

    答案数组开10000。而不是5000。(我稍蠢,嗯)

    复杂度$O(n^2)$

     1 #include<cstdio>
     2 #define int long long
     3 #define mod 123456789
     4 int fib[5005],ans[10005],f[5005][10005];
     5 main(){
     6     int n;scanf("%lld",&n);
     7     fib[0]=1;
     8     for(int i=2;i<=n;++i)fib[i]=(fib[i-1]+fib[i-2])%mod;
     9     for(int i=0;i<n;++i)for(int j=1;j<n-i;++j)(ans[j]+=fib[i]*fib[j])%=mod;
    10     for(int i=2;i<n;++i){
    11         for(int j=1;j<=n<<1;++j)f[i][j]=f[i-1][j];
    12         for(int j=1;j<=i;++j)(f[i][i+j]+=fib[i-1]*fib[j])%=mod;
    13         for(int j=1;j<i;++j)(f[i][i+j]+=fib[i]*fib[j-1])%=mod;
    14     }
    15     for(int i=1;i<n;++i)for(int j=1;j<=n<<1;++j)(ans[j]+=f[n-i][j]*fib[i])%=mod;
    16     for(int i=1;i<=n<<1;++i)printf("%lld ",ans[i]);puts("");
    17 }
    View Code
  • 相关阅读:
    JavaSE 基础 第51节 定义自己的异常
    JavaSE 基础 第50节 Java中的异常链
    JavaSE 基础 第49节 手动抛出异常
    JavaSE 基础 第48节 Java中的异常声明
    JavaSE 基础 第47节 获取异常信息
    JavaSE 基础 第46节 异常的分类
    JavaSE 基础 第45节Java异常快速入门
    JavaSE 基础 第44节 引用外部类的对象
    JavaSE 基础 第43节 静态内部类
    通用爬虫
  • 原文地址:https://www.cnblogs.com/hzoi-DeepinC/p/11648052.html
Copyright © 2020-2023  润新知