-TEST 12 for NOIP ......(30-300)-----(( ! ))

来源:互联网 发布:架子鼓软件 编辑:程序博客网 时间:2024/05/20 05:31

头更更大

这个10月完就要去搞NOIP了。。。

10月30天也就3次测试。。。为保佑进省一我还是每次测试玩都写个总结。。


boomshakalaka。。。彻底全部写炸。。。
第一题双连通图都打好了最后输出卖萌
第二题不敢打状态压缩,第三题不会也就算了。。。
第一题全挂是什么鬼??????

这里写图片描述

拿面包砸死自己的心情都没了
最近态度明显没有以前积极了。。可能是之前考的还可以的原因。。然后自我膨胀被稍难一点的题啪啪打脸。。
还是一句话:多刷题!!

下面面详细解答:

T1 建设图(30/100):

考的是刚学过的很简单的双连通分量(在无向图中裸奔Tarjan)即可。。。找到所有入度为1的双连通分量。取为ans。
但是最后输出的时候做死的ans-1??????
(没有考虑到 菊花 发散图,当时只考虑了链状图)
(ans+1)/2就满分。。
自己去把自己拖出去枪毙5分钟

T2 乘积(0/100):

貌似70%的分是可以暴力做的?????
100%的正解用到了我最不擅长的状压Dp。。。今天要多练练再回来看。。一定要回来把这道题搞了!!!

T3 Math(0/100):

本来想的乱搞一个快速幂套快速乘。。。结果GG
GYR大佬一群人则是通过找规律直接搞出正解。。。膜拜orz

感想

多练状压Dp!!!多刷题!!!不要卖萌!!!
还有发现没事可以上洛谷 玩一玩 刷刷题。。。

代码

T1

std.cpp

#include<iostream>#include<iomanip>#include<cstdio>#include<cstdlib>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<algorithm>#include<queue>using namespace std;const int kkk = 200005;inline int read(){    int X=0,w=1; char ch=0;    while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}    while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();    return X*w;}int n,m,val,res=0,ans=0;int first[kkk];struct node{    int u,v,val,next;    bool flag;}side[kkk*2];int cnt=0,top=0,tot=0,cci=1;void addedge(int u,int v,int val){    side[++cci].u = u;    side[cci].v = v;    side[cci].val = val;    side[cci].next = first[u];    first[u] = cci;}bool visit[kkk];int num[kkk],edge[kkk];int dfn[kkk],low[kkk],belong[kkk],stk[kkk];void tarjan(int u){    low[u]=dfn[u]=++cnt;    stk[++top]=u;   visit[u]=true;    for(int i=first[u];i;i=side[i].next)    {        if(side[i].flag)continue;        side[i].flag = true;        side[i^1].flag = true;        int v = side[i].v;        if(!dfn[v]){tarjan(v);low[u]=min(low[u],low[v]);}        else if(visit[v]){low[u]=min(low[u],dfn[v]);}    }    if(dfn[u]==low[u])    {        int v=-1;tot++;        while(u!=v)        {            v=stk[top--];            belong[v]=tot;            num[tot]++;            visit[v]=false;        }    }}int main(){    std::ios::sync_with_stdio(false);    std::cin.tie(0);std::cout.tie(0);    n=read();   m=read();    for(int i=1;i<=m;i++)    {        int u,v;        u=read();   v=read();        addedge(u,v,1);        addedge(v,u,1);    }    for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);    for(int i=2;i<=cci;i+=2)        if(belong[side[i].u]!=belong[side[i].v])            edge[belong[side[i].u]]++,            edge[belong[side[i].v]]++;    int ans=0;    for(int i=1;i<=tot;i++)        if(edge[i]==1)            ans++;    cout<<(ans+1)/2<<endl;    return 0;}

T2

zay.cpp

#include<iostream>#include<iomanip>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<algorithm>#include<cmath>#include<queue>#include<vector>using namespace std;typedef long long ll;const int nod=1000000007;int n,k;int prime[18]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59};inline int read(){    int X=0,w=1; char ch=0;    while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}    while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();    return X*w;}bool check(ll x){    for(int i=1;i<=17;i++)        if(x%(prime[i]*prime[i])==0)            return false;    return true;}ll ans[600];void get_ans(int pre,ll now,int cnt){    if(check(now))ans[cnt]++;    else return;    if(cnt==k)  return;    for(register int i=pre+1;i<=n;i++)        get_ans(i,(ll)now*i,cnt+1);}int t,sum=0;int main(){    t=read();    while(t--)    {        sum=0;        n=read();   k=read();               memset(ans,0,sizeof(ans));              for(register int i=1;i<=n;i++)get_ans(i,i,1);        for(register int i=1;i<=k;i++)sum=(sum+ans[i])%nod;        cout << sum << endl;    }}

std.cpp

T3

std.cpp

#include<iostream>#include<iomanip>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<algorithm>#include<cmath>#include<queue>#include<vector>using namespace std;typedef long long ll;inline int read(){    int X=0,w=1; char ch=0;    while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}    while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();    return X*w;}ll x,y;ll a;int n; ll ksc(ll x,ll y,ll z)//快速乘 {    ll ans=0;    while(y>0)    {        if(y&1)ans=(ans+x)%z;        y=y>>1;        x=(x+x)%z;    }    return ans;}ll ksm(ll x,ll y,ll z)//快速幂 {    ll ans=1;    while(y>0)    {        if(y&1)ans=ksc(ans,x,z);        y=y>>1;        x=ksc(x,x,z);     }    return ans;}int t; int main(){    t=read();    while(t--)    {        a=read();   n=read();        if(a%2){cout<<1<<endl;continue;}        else        {            int ans=0;            int maxx=(1<<n);            for(int i=2;i<=n;i+=2)            if(ksm(a,i,maxx)==ksm(i,a,maxx))                ans++;            int c=(n+a-1)/a;            int x=(1<<n)>>c;            int t=n>>c;            ans = ans+x-t;            cout<<ans<<endl;        }    }    return 0;}
原创粉丝点击