HUST的比赛地址大约是这里:http://vjudge.net/contest/view.action?cid=47447#overview
这次呢,是有个什么四川省赛的选拔,挑3个队伍去四川比赛(每个人最终得自费644元Q^Q好贵的说),现场赛好热的说……不吐槽了,写个我写出来的题目的题解好了
写出来的是A、C、D、E、G五道——
A题:FZU 2147
#include <cmath>
#include <cctype>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
long long a, b;
void solve(long long a, long long b)
{
int cnt = 0;
while (a>b)
{
a -= ((a - 1) / 2);
cnt++;
}
printf("%d\n", cnt);
}
int main()
{
//freopen("in.txt","r",stdin);
int cases=0;
scanf("%d",&cases);
for(int _case=1;_case<=cases;_case++)
{
scanf("%I64d%I64d\n", &a, &b);
printf("Case %d: ", _case);
solve(a, b);
}
return 0;
}
C题:FZU 2151
读入%c的时候回车永远是WA的预备军……
#include <cmath>
#include <cctype>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
int cmp(const void *a, const void *b)
{
return(*(int *)a-*(int *)b);
}
char map[101][101];
int main()
{
//freopen("in.txt","r",stdin);
int cases=0;
scanf("%d",&cases);
for(int _case=1;_case<=cases;_case++)
{
printf("Case %d:",_case);
int n=0,m=0,tol=0;
char now,huiche;
scanf("%d%d",&n,&m);
//又被回车给害了……
/***************************************
for(int i=0;i<n*m;i++)
{
scanf("%c",&now);
if(now=='O')tol++;
}
***************************************/
for(int i=0;i<n;i++)
{
scanf("%c",&huiche);
for(int j=0;j<m;j++)
{
scanf("%c",&now);
if(now=='O')tol++;
}
}
cout<< (tol%2==0?" Fat brother":" Maze");
printf("\n");
}
return 0;
}
这居然也是道奇偶题…… 字符串长度奇偶…… 简称:签到题
#include <cmath>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
char str[11000];
int main()
{
//freopen("in.txt","r",stdin);
int cases=0;
scanf("%d",&cases);
for(int _case=1;_case<=cases;_case++)
{
printf("Case %d: ",_case);
scanf("%s",str);
if(strlen(str)%2==0)printf("Even\n");
else printf("Odd\n");
}
return 0;
}
E题:CSU 1363 (其实我想问CSU是啥……毕竟E~G都中途无限JE了,也进不去的样子……)
很明显的这是一道DP的题目,当我们想知道长度为i的有多少种的时候,我们需要事先知道什么呢?
1、长度为i-1的有多少种
2、长度为i-2的有多少种
为啥呢?大家想想看哦~
(1)如果知道长度为i-1的有多少种了,那是不是在这些种类后面加上一个0,都是满足条件的长度为i的情况呢~^_^
(2)那加上1呢?嗯,也有很多可以的呢,但是也有不可以的哦,如果加1之前倒数第二位是1,倒数第一位是0,我们就不能加1了呢,那么该怎么处理好呢~
——很简单,如果倒数第二位是1的话,那么一定会存在和它一样多数量的倒数二位为“10”的情况,原因?见(1)
说到这就很明了了,我们把每一种长度的最后一位为0还是1分开存储,比如:定义 int dp[i][2];,i是长度,dp[i][0]是长度为i的尾为0的串的种数,dp[i][1]是长度为i的尾为1的串的种数,根据上面说的,那么动态转移方程就是:
dp[i][0]=dp[i-1][0]+dp[i-1][1];
dp[i][1]=dp[i][0]-dp[i-2][1];
#include <cmath>
#include <cctype>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
const int lim=9997;
int dp[10002][2];//0-0 1-1
void dp_init()
{
dp[1][0]=1,dp[1][1]=1;
dp[2][0]=2,dp[2][1]=2;
dp[3][0]=4,dp[3][1]=3;
dp[4][0]=7,dp[4][1]=5;
for(int i=5;i<10001;i++)
{
dp[i][0]=dp[i-1][0]+dp[i-1][1];
dp[i][1]=dp[i][0]-dp[i-2][1];
dp[i][0]=dp[i][0]%lim;
dp[i][1]=dp[i][1]%lim;
}
}
void solve(int num)
{
int ans=dp[num][0]+dp[num][1];
cout<< (ans%lim+lim)%lim <<endl;
}
int main()
{
memset(dp,0,sizeof(dp));
dp_init();
while(1)
{
int num=0;
scanf("%d",&num);
if(num<0)return 0;
else solve(num);
}
return 0;
}
G题:
这道题漏了个回车又得了个PE……无奈了……
以及……代码如果过长请无视……看到大数取模的第一反应是除法不封闭需要乘以模逆元,求模逆元需要扩展欧几里得算法,所以直接题目都没看完就开始敲这些东西……然后剩了8分钟写核心代码……我真心读题要特训一下Q^Q
题意是说,有一个长度为N的序列,里面的数字都是在1-M之间取的整数,问满足如下条件的序列有多少个:1、序列中任何一个长度为M的字串都相同或者都不同
2、(坑)如果序列都不到M长度,到底是怎么算呢…… (原先以为是C(n,m) )好吧题目里给了个125……看来是每个位置都随便放了呢,那难不成就是pow(n,m)了……
说了半天其实这个题是这么个规律:
#include <map>
#include <stack>
#include <queue>
#include <cmath>
#include <cctype>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
const long long lim=987654321;
int n,m;
ll Jval[1000001];//jiecheng juzhen
void Jc_init()
{
Jval[0]=1;
for(int i=1;i<=1000000;i++)
Jval[i]=(i*Jval[i-1])%lim;
}
struct _gcd
{
ll d;
ll x;
ll y;
};
_gcd ex_EUCLID(ll a,ll b) //EUCLID algorithm
{
_gcd aa,bb;
if(b==0){
aa.d = a;
aa.x = 1;
aa.y = 0;
return aa;
}
else{
bb = ex_EUCLID(b,a%b);
aa.d = bb.d;
aa.x = bb.y;
aa.y = bb.x - bb.y * (a/b);
}
return aa;
}
ll _Ni(ll val,ll lim)
{
ll x;
_gcd aa;
aa = ex_EUCLID(val,lim); //EUCLID 求模逆元
return aa.x;
}
ll solve1()
{
ll ans=m;
return ans;
}
ll Calc()
{
ll Cans= ( Jval[m]*_Ni(Jval[m-n],lim) ) %lim;
return Cans;
}
ll solve2() //m+ m!/(m-n)!
{
ll ans=0;
ans+=m;
ans+= Jval[m];
return (ans%lim+lim)%lim;
}
ll solve(int m,int n)
{
int i,j;//loop vars
ll ans=1;
if(m==1) return ans;
if(n>=m)
{
if(m==2) for(i=1;i<=n;i++) ans=ans*m%lim;
else ans=Jval[m]+m; // m!+m
return ans;
}
else
{
for(i=1;i<=n;i++) ans=ans*m%lim;
return ans;
}
}
int main()
{
Jc_init();
while(1)
{
scanf("%d%d",&n,&m);
if(n<0&&m<0)return 0;
printf("%I64d\n",solve(m,n));
// if(n>m)printf("%I64d\n",solve1());
// else printf("%I64d\n",solve2());
}
return 0;
}
我的太乱了对不起大家Q_Q
#include <iostream>
#define MOD 987654321
using namespace std;
int main()
{
int n,m;
while(scanf("%d%d",&n,&m) && n!=-1 && m!=-1)
{
int i;
long long ans;
if(n<m)
{
ans=1;
for(i=1; i<=n; i++)
ans = (ans*m)%MOD;
}
else
{
ans = 1;
if(m==1)
ans=1;
else if(m==2)
{
for(i=1; i<=n; i++)
ans = (ans*m)%MOD;
}
else
{
for(i=2; i<=m; i++)
ans = (ans*i)%MOD;
ans += m;
}
}
printf("%lld\n",ans%MOD);
}
return 0;
}