HDU杭电2013 多校第一场解题报告

太水了尴尬....

Partition:

这道题目就是说在题目给出的那种构造方法下,对于一个数字n,在它的构造序列中,数字k出现了多少次?

对特殊情况特判一下;然后如果选点的时候没选到端点,那么有n-k-1种情况,剩余的n-k-2位点,这是2^(n-k-2)*

(n-k-1);如果选到端点共两种,剩余(n-k-1),共有2*2^(n-k-1),求和即可;

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#define N 1000000007
using namespace std;
long long p(long long x,long long y)//求y次方
{
    long long res=1;
    while(y>0)
    {
        if(y%2==1)
        {
            res=(res*x)%N;
        }
        x=(x*x)%N;
        y/=2;
    }
    return res%N;
}
int main()
{
    int t;
    __int64 a,b,sum;
    scanf("%d",&t);
    for(int i = 0; i < t; ++i)
    {
        scanf("%I64d%I64d",&a,&b);
        if(b==a)
        {
            cout<<1<<endl;
        }
        else if(b>a)
        {
            cout<<0<<endl;
        }
        else
        {
            sum=p(2,a-b)%N;
            sum=(sum%N+((a-b-1)*p(2,(a-b-2)))%N)%N;
            printf("%I64d\n",sum);
        }
    }
    return 0;
}

Park Visit:

这道题目图....很弱....

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#define inf 1<<28
using namespace std;
inline void RD(int &ret)
{
    char c;
    do
    {
        c = getchar();
    }
    while(c < '0' || c > '9') ;
    ret = c - '0';
    while((c=getchar()) >= '0' && c <= '9')
        ret = ret * 10 + ( c - '0' );
}
struct xl
{
    int e , next;
} ed[11111111];
int head[111111] ,num;
int dis[11111111] ;
int pp  ;
int n , m ;
bool vis[1111111] ;
int qe[11111111] ;
void init(int a ,int b )
{
    ed[num].e = b ;
    ed[num].next = head[a] ;
    head[a] = num ++ ;
}
void init()
{
    memset(head,-1,sizeof(head));
    num=0;
}
int bfs(int pos)
{
    int i,h = 0 ,t = 0 ;
    for(i = 0 ; i <= n ; i ++ )
    {
        dis[i]=inf;
        vis[i]=0;
    }
    dis[pos] = 0 ;
    qe[h ++ ] = pos ;
    int mx = 0 ;
    vis[pos] = 1 ;
    while(h > t)
    {
        int temp = qe[t ++ ] ;
        for (int i = head[temp] ; ~i ; i  = ed[i].next )
        {
            int now = ed[i].e ;
            if(dis[now] > dis[temp] + 1)
            {
                dis[now] = dis[temp] + 1 ;
                qe[h ++ ] = now ;
                if(dis[now] > mx)
                {
                    mx = dis[now] ;
                    pp = now ;
                }
            }
        }
    }
    return mx ;
}
int main()
{

    int T,i;
    scanf("%d",&T);
    while(T--)
    {

        init() ;
        scanf("%d%d",&n,&m);
        int a , b ;
        for(i=0; i<n-1; i++)
        {
            RD(a);
            RD(b);
            init(a,b) ;
            init(b,a) ;
        }
        bfs(1) ;
        int mm = bfs(pp) ;
        while(m--)
        {
            int k ;
            RD(k) ;
            if(k <= mm)
            {
                printf("%d\n", k-1) ;
            }
            else
            {
                printf("%d\n",(k-mm-1)*2+mm) ;
            }
        }
    }
    return 0 ;
}

I-number:

这道题目就是要求满足题目的3个条件的数字,可以直接暴力搞过:

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#include <queue>

using namespace std;

char s[100005];
int sum,aa;

int main()
{
    int t;
    int n,m,l;
    int q;
    scanf("%d",&t);
    getchar();
    while(t--)
    {
        q = 0;
        gets(s);
        l = strlen(s);
        sum = 0;
        for(int i=0; i<l; i++)
        {
            sum += s[i] - '0';
        }
        if(s[l-1] == '9')
        {
            aa = 0;
            sum++;
            aa++;
            s[l-1] = '0';
            m = l - 2;
            while(m>=0&&s[m] == '9')
            {
                sum++;
                aa++;
                s[m] = '0';
                m--;
            }
            if(m>=0)
            {
                s[m] = s[m] + 1;
            }
            else
            {
                q = 1;
            }
            sum++;
            aa++;
            //cout<<aa<<endl;
        }
        else
        {
            sum++;
            s[l-1] = s[l-1] + 1;
        }
        while(sum%10!=0)
        {
            if(s[l-1] == '9')
            {
                sum++;
                s[l-1] = '0';
                m = l - 2;
                while(m>=0&&s[m] == '9')
                {
                    sum++;
                    s[m] = '0';
                    m--;
                }
                if(m>=0)
                {
                    s[m] = s[m] + 1;
                }
                else
                {
                    q = 1;
                }
                sum++;
            }
            else
            {
                sum++;
                s[l-1] = s[l-1] + 1;
            }
        }
        if(q == 1)
        {
            printf("1%s\n",s);
        }
        else
        {
            printf("%s\n",s);
        }
    }
    return 0;
}



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值