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

版权声明:本文为博主原创文章,未经博主允许你想转还是转吧总之我这点东西还有版权这说法吗呵呵呵呵…… https://blog.csdn.net/AVALON_X/article/details/78330900

头更更大

这个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;
}

没有更多推荐了,返回首页