【2019.9.15】

2019.9.15

summary

  • 时间安排不合理 大部分时间用在1、2题 第三题啥都没打成
  • 低级错误 空间开小了 而且最开始打的时候我都没有测第四组样例?!最后十几分钟发现第四组样例没过==
  • 基础不牢 加分二叉树这题我都没做过 gg
  • 浮躁

Candy

糖糖有一个整数A,设A的十进制表示为 \(a_1a_2a_3...a_n\);
定义 \(rotate(a_1a_2a_3...a_n)=a_2a_3...a_na_1\)
糖糖利用这个方法生成了n个数字串,其中:
\(b1=a,b2=rotate(b1),...,b_n=rotate(b_{n-1})\)
糖糖对于这些数字串在十进制下的和很感兴趣,现设 \(\sum{b_i}=S\)
她想知道S的最小非1的因子是多少

首先肯定先找下规律看看有没有规律,但是没用的.

不难发现最终的和的形式是\(sum\_digit(111111....1)\)的形式,其中\(sum\_digit\)表示所有数位的和.

所以无非答案就是\(sum\_digit\)的最小质因子或者是\(11111111..1\)的最小质因子

若最终答案不在\(sum\_digit\)里面的话呢,假设\(sum\_digit\)的最小质因子为\(x\)那么也就是说\(1111111...1\)里面存在一个质因子\(y\),\(y<x\)并且\(1111111...1\%y==0\)

考虑\(1111111...1=(10^n-1)/9\)(n表示有多少个1)

那么问题就转化成了\((10^n-1)/9%y==0\),我们可以枚举这个\(y\).因为和最大也就\(5e6\),所以\(y\)最多也不会超过\(5e6\),用线性筛预处理一下即可

==我搞那个b=qpow(10ll,n,(ll)prim[i]*9)要模\(prim[i]*9\)推了好久

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=500000+10,M=5e6+50,inf=0x3f3f3f3f;
int n,sum;char a[N];

int v[M],prim[N],cnt=0;
void Prime(int m){
    for(int i=2;i<=m;i++){
        if(!v[i]) v[i]=i,prim[++cnt]=i;
        for(int j=1;j<=cnt&&prim[j]<=m/i;j++){
            v[i*prim[j]]=prim[j];
            if(!i%prim[j]) break; 
        }
    }
}

ll qpow(ll a,int b,ll P){
    ll ret=1ll;
    while(b){
        if(b&1) ret=(ret*a)%P;
        a=(a*a)%P,b>>=1;
    }
    return ret;
}

int main(){
    //freopen("candy.in","r",stdin);
//  freopen("candy.out","w",stdout);
    Prime(4500000);
    //printf("%d\n",cnt);
    //printf("%d %d",v[11111],v[111111]);
    while(scanf("%s",a+1)!=EOF){
        n=strlen(a+1),sum=0;
        for(int i=1;i<=n;++i) sum+=(a[i]-'0');
        int ans=v[sum];
        ll b;
        for(int i=1;i<=cnt&&prim[i]<(sum==1?inf:ans);++i){
            b=qpow(10ll,n,(ll)prim[i]*9);//
            b=(b-1)/9;
            if(!b%prim[i]){ans=prim[i];break;}
        }
        printf("%d\n",ans);
    }
    return 0;
}

遗失的二叉树

小T很喜欢研究树形数据结构,这一天,他的哥哥小Q丢给了小T一个问题:给定一序列,判断其是否为一颗二叉树的中序遍历,对于小T来说,这个问题太简单了,所以哥哥又添加了一个条件:树边连接的两个点的权值不能互质。现在小T对这个问题毫无对策,于是他请你帮他解决这个问题。

==看到中序遍历然后就放弃 刚另外两道题用了太多时间 最后这题只剩差不多半个小时四十分钟的亚子

精灵

wonderland的地图可以抽象成一个N个点的有根树,第i个点上生活着编号为i的精灵,根节点为1号节点。

一个点的深度定义为这个节点到根的距离+1,第i只精灵和第j只精灵的亲密度为他们在树上最近公共祖先的深度。

现在Jessica想询问你Q次,每次询问第z只精灵和第l~r只精灵的亲密度的和是多少。答案对201314(不是一个质数)取模。

看完题 75分很稳

然后想好了暴力的思路 准备去看第二题 看着中序遍历我还是滚了...

在草稿本上捯饬了半天 我居然想出了正解

对不起我询问开的一倍空间我这就滚 30

100昏

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ls (o<<1)
#define rs (o<<1|1)
const int N=1e5+10,M=1e5+50,inf=0x3f3f3f3f,P=201314;
int n,m;ll ans[N];
struct quer{
    int id,pos,k,x;
    bool operator <(const quer&X)const{return pos<X.pos;}
}q[N<<1];
template <class t>void rd(t &x){
    x=0;int w=0;char ch=0;
    while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    x=w?-x:x;
}

int head[N],tot=0;
struct edge{int v,nxt;}e[N];
void add(int u,int v){
    e[++tot]=(edge){v,head[u]},head[u]=tot; 
}

int idx=0,dfn[N],f[N],son[N],sz[N],dep[N],top[N];
void dfs1(int u,int fa){
    dep[u]=dep[fa]+1,sz[u]=1;
    for(int i=head[u],v,mxs=-1;i;i=e[i].nxt){
        dfs1((v=e[i].v),u),sz[u]+=sz[v];
        if(sz[v]>mxs) son[u]=v,mxs=sz[v]; 
    }
}
void dfs2(int u,int topf){
    dfn[u]=++idx,top[u]=topf;
    if(!son[u]) return;
    dfs2(son[u],topf);
    for(int i=head[u],v;i;i=e[i].nxt)
    if((v=e[i].v)!=son[u]) dfs2(v,v);
}

struct node{ll val,tg;}t[N<<2];
void pup(int o){t[o].val=t[ls].val+t[rs].val;}
void updnode(int o,int l,int r,ll k){t[o].val+=(r-l+1)*k,t[o].tg+=k;}
void pudw(int o,int l,int r){
    if(!t[o].tg) return;
    int mid=l+r>>1;
    updnode(ls,l,mid,t[o].tg),updnode(rs,mid+1,r,t[o].tg),t[o].tg=0;
}
void upd(int o,int l,int r,int x,int y,ll k){
    if(l>y||r<x) return;
    if(x<=l&&r<=y){updnode(o,l,r,k);return;}
    pudw(o,l,r);
    int mid=l+r>>1;
    upd(ls,l,mid,x,y,k),upd(rs,mid+1,r,x,y,k);
    pup(o);
}
ll query(int o,int l,int r,int x,int y){
    if(l>y||r<x) return 0;
    if(x<=l&&r<=y) return t[o].val;
    pudw(o,l,r);
    int mid=l+r>>1;ll ans;
    ans=query(ls,l,mid,x,y)+query(rs,mid+1,r,x,y);
    pup(o);
    return ans;
}

void updrange(int x,int y){
    while(top[x]!=top[y]){
        if(dep[top[x]]<dep[top[y]]) swap(x,y);
        upd(1,1,n,dfn[top[x]],dfn[x],1);
        x=f[top[x]];
    }
    if(dep[x]>dep[y]) swap(x,y);
    upd(1,1,n,dep[x],dep[y],1);
}
ll qrange(int x,int y){
    ll sum=0;
    while(top[x]!=top[y]){
        if(dep[top[x]]<dep[top[y]]) swap(x,y);
        sum+=query(1,1,n,dfn[top[x]],dfn[x]);
        x=f[top[x]];
    }
    if(dep[x]>dep[y]) swap(x,y);
    sum+=query(1,1,n,dep[x],dep[y]);
    return sum;
}

int main(){
    freopen("T1.txt","r",stdin);
//  freopen("elf.out","w",stdout);
    rd(n),rd(m);
    for(int i=2,x;i<=n;++i) rd(f[i]),add(++f[i],i);
    dfs1(1,0),dfs2(1,1);
    int x,l,r,C=0;
    for(int i=1;i<=m;++i){
        rd(l),rd(r),rd(x);
        q[++C]=(quer){i,++l-1,-1,++x},q[++C]=(quer){i,++r,1,x};
    }
    sort(q+1,q+C+1);
    for(int i=1,j=0,pos,id;i<=C;++i){
        id=q[i].id,pos=q[i].pos,x=q[i].x;
        while(j<n&&j<pos) updrange(1,++j);
        ans[id]=(ans[id]+q[i].k*qrange(1,x))%P;
    }
    for(int i=1;i<=m;++i) printf("%lld\n",((ll)ans[i]+P)%(1ll*P));
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/lxyyyy/p/11523001.html
今日推荐