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