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

头更更大

这个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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值