我们十分荣幸的有机会作为邀请队伍去了长沙理工大学参加他们的第十四届程序设计竞赛现场赛,在这里感谢长沙理工的同学们~

这是我们队伍第一次团队比一次比较正规的比赛吧(之前的队伍拆了)。总的来说发挥的一般般,就A了6个题,有道bfs题贼水,当时闲麻烦没有打,最后的一个半小时,放弃bfs题 集全队的力量攻那个杨辉三角却没有做出来,然后赛后一个小时打出bfs题交一发,AC。遗憾满满.

希望以后再接再厉吧~~

长理oj:​​http://csustacm.com:4803/contest/32/problems​

题解:

链接:https://pan.baidu.com/s/1rgtcY4QWEUaHd5LL_IQ8dQ 

提取码:wfce 

复制这段内容后打开百度网盘手机App,操作更方便哦

热烈庆祝建国70周年

Description


众所周知,今年2019年是我们伟大的祖国建国70周年。

Dillonh 因为这个事情高兴了好久。

同时,他最近在苦练英语,所以他想把这个好消息用英语告诉那些外国朋友。

"This year is the 70th anniversary of the founding!" Dillonh每见到一个外国朋友就会兴奋地向他们说出这一句话。

现在Dillonh 想知道如果今年是nn年的话,他又该如何用英文向外国友人来介绍呢?

他英语不好,自然来寻找你们的帮助了,你们能帮帮他吗?

Input


第一行输入一个整数TT,代表样例组数。

接下来TT行,每行都有一个整数nn,代表今年是哪一年。

数据范围:

1\leq T \leq 1001≤T≤100;

1949 < n \leq 20491949<n≤2049。

Output


对于每个nn,输出一行介绍今年是建国第几周年的英文。(注意后缀哦)

Sample Input 1 

2
2019
2000

Sample Output 1

This year is the 70th anniversary of the founding!
This year is the 51st anniversary of the founding!

Sample Input 2 

3
1960
1961
1962

Sample Output 2

This year is the 11th anniversary of the founding!
This year is the 12th anniversary of the founding!
This year is the 13th anniversary of the founding!

Sample Input 3 

3
1950
1951
1952

Sample Output 3

This year is the 1st anniversary of the founding!
This year is the 2nd anniversary of the founding!
This year is the 3rd anniversary of the founding!

Source

长沙理工大学第十四届程序设计竞赛

水题,交给队友做

#include<bits/stdc++.h>
using namespace std;
char s[11][4]={"th","st","nd","rd","th","th","th","th","th","th","th"};
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
scanf("%d",&n);
int ans=n-1949;
// printf("%d\n",ans);
if(10<ans&&ans<20)
{
printf("This year is the %dth anniversary of the founding!\n",ans);
}
else
{
printf("This year is the %d%s anniversary of the founding!\n",ans,s[ans%10]);
}
}
}

谁动了我的午饭

Description


有一个问题一直困惑着B206的那群毒瘤,就是啥时候去吃饭呀?每当某人提出去吃饭的时候,就发现11:50或5:50了,现在去吃饭全是人,那排队不得贼难受啊。

某天,毒瘤会长11:40去食堂吃饭时发现这里有nn个窗口,第ii个窗口打一份饭的时间是a_iminaimin,第ii个窗口已经排了b_ibi个人,1\le i\le n1≤i≤n。

这个食堂11:40才会开始打饭,也就是说就算你提前到了,也得等到11:40才能开始。

但是如果排队时间超过30min,毒瘤会长就会去机房待会再去吃饭。

提问:最早几点钟能轮到会长打饭,如果会长决定去机房,请输出-1。

Input


第一行一个整数nn,代表有nn个窗口,1\le n\le 1001≤n≤100。

第二行nn个整数,代表a_1,...,a_na1,...,an,1\le a_i\le 401≤ai≤40。

第三行nn个整数,代表b_1,...,b_nb1,...,bn,0\le b_i\le 1000≤bi≤100。

Output


请输出轮到会长打饭的最早时间,如果会长决定去机房,请输出-1。

时间请严格按照这种格式输出:ab:cd,栗子:12:01。

Sample Input 1 

2
1 1
1 1

Sample Output 1

11:41

Sample Input 2 

1
30
1

Sample Output 2

12:10

Sample Input 3 

1
31
1

Sample Output 3

-1

Source

长沙理工大学第十四届程序设计竞赛

水题,还是交给队友做

找到每只队伍最后时间,然后取最小的

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
int a[120],b[120];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
cin>>b[i];
int mi=1e9;
for(int i=1;i<=n;i++)
{
mi=min(mi,a[i]*b[i]);
}
if(mi>30)
{
printf("-1");
return 0;
}
mi+=40;
printf("%d:%02d\n",11+mi/60,mi%60);
}

“迪莫,你在哪里?”

Description


“迪莫,你在哪里?”

洛克醒来发现迪莫失踪了,由于到处寻找。可是找了半天也没有发现迪莫的踪迹,于是他通过可丽希亚公主的帮忙得知迪莫迷失在了一个迷宫中,于是洛克他踏上了寻找迪莫之旅。

在洛克出发之前,可丽希亚公主给了洛克一张关于这个迷宫的地图,并派出了自己的宠物皇家狮鹫来加快洛克寻找迪莫的速度。

现已知这个迷宫是一个n\times mn×m的矩阵,洛克进入迷宫的位置用'X'表示,迪莫的位置用'Y'表示,皇家狮鹫的位置用'R'表示。洛克每分钟只能往上下左右四个方向移动一个单位,而骑上皇家狮鹫之后可以瞬间到达同行或同列的任何位置,但是皇家狮鹫每次拐弯需要花一分钟的时间(也就是说皇家狮鹫只要不拐弯就不会花费时间),洛克乘坐皇家狮鹫需要花一分钟的时间。

洛克现在正心急如焚,想要尽快找到迪莫,所以找到了优秀的你,希望你能够编写一个程序来告诉他他至少还要多长时间才能找到迪莫(第0分钟时洛克已经进入迷宫)。

Input


第一行一个正整数TT,表示有多组数据,T\leq 300T≤300。

每组数据格式如下:

第一行为n,mn,m表示迷宫的大小(2\leq n,m\leq10002≤n,m≤1000)。

接下来nn行每行mm个字符,表示迷宫的组成。

迷宫组成如下:

‘.'表示可以通过的格子。

'#'表示障碍物不能进入该格子内。

'X'表示洛克的初始位置。

’Y‘表示迪莫的出口。

'R'表示皇家狮鹫的位置。

Output


每组数据输出一行,表示洛克至少要花多久时间才能找到迪莫,如果洛克无法找到迪莫(可怜兮兮),请输出-1。

Sample Input 1 

2
4 4
X#..
....
R...
...Y
3 4
X#..
....
R..Y

Sample Output 1

4
3

Hint

每组数据输出一行,表示洛克至少要花多久时间才能找到迪莫,如果洛克无法找到迪莫(可怜兮兮),请输出-1。

Source

长沙理工大学第十四届程序设计竞赛

bfs的题,注意遇到坐骑重新开始一个新的bfs,拐弯 加一个while就可以处理了

#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N=1e3+10;
char ma[N][N];
int si,sj,ei,ej,ri,rj;
int vis[N][N],vis1[N][N][4];
int check(int x,int y,int d)
{
//printf("chcke\n");
if(x<1||x>n||y<1||y>m||ma[x][y]=='#'||vis1[x][y][d])
return 0;
return 1;
}
struct node
{
int x,y,step;
node(int x1,int y1,int n1)
{
x=x1,y=y1,step=n1;
}
};
int dir[4][2]={0,1,0,-1,1,0,-1,0};
int bfs_1(int num)
{
memset(vis1,0,sizeof(vis1));
vis1[ri][rj][0]=vis1[ri][rj][1]=vis1[ri][rj][2]=vis1[ri][rj][3]=1;
queue<node>que;
que.push(node(ri,rj,num));
while(!que.empty())
{
node u=que.front();que.pop();
// printf("u.x:%d u.y:%d\n",u.x,u.y);
if(u.x==ei&&u.y==ej)
{
return u.step;
}

for(int i=0;i<4;i++)
{
int x=u.x,y=u.y;
x+=dir[i][0];
y+=dir[i][1];
while(check(x,y,i))
{
vis1[x][y][i]=1;
if(ma[x][y]=='Y')
return u.step;
que.push(node(x,y,u.step+1));
x+=dir[i][0];
y+=dir[i][1];
if(x<1||y<1||x>n||y>m) break;
if(ma[x][y]=='#') break;

}
}

}
return 1e9;
}
void bfs()
{
int ans=1e9+10;
queue<node>que;
que.push(node(si,sj,0));
vis[si][sj]=1;
while(!que.empty())
{
node u=que.front();que.pop();
if(u.x==ei&&u.y==ej)
{
printf("%d\n",min(ans,u.step));
return ;
}
if(u.x==ri&&u.y==rj)
{
ans=bfs_1(u.step+1);
//printf("ans:%d\n",ans);
}
for(int i=0;i<4;i++)
{
int x=u.x+dir[i][0];
int y=u.y+dir[i][1];

if(vis[x][y]||x<1||y<1||x>n||y>m) continue;
vis[x][y]=1;
que.push(node(x,y,u.step+1));
}
}
printf("-1\n");
}
int main()
{
int t;
cin>>t;
while(t--)
{
memset(vis,0,sizeof(vis));
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>ma[i]+1;
for(int j=1;j<=m;j++)
{
if(ma[i][j]=='X') si=i,sj=j;
if(ma[i][j]=='Y') ei=i,ej=j;
if(ma[i][j]=='R') ri=i,rj=j;
if(ma[i][j]=='#') vis[i][j]=1;
}
}
bfs();
}
}
/*
2
4 4
X#..
....
R...
...Y
*/

有趣的数学题

Description


众所周知,小明是数学大佬,有一天他发现了这样一道有趣的数学题:


定义f_{n}=\sum\limits_{i=0}^{\lfloor \frac{n+1}{2} \rfloor-1}C_{n-i-1}^{i}fn=i=0∑⌊2n+1⌋−1Cn−i−1i。现在给定四个数n,m,x,y,n\leq m,x\leq yn,m,x,y,n≤m,x≤y,其中,求gcd(f_{n-1}\times f_{m} + f_{n}\times f_{m+1},f_{x-1}\times f_{y}+f_{x}\times f_{y+1})gcd(fn−1×fm+fn×fm+1,fx−1×fy+fx×fy+1)的答案对1e9+71e9+7取模后的结果。


小明看到这题后发现这就是个傻逼题,但是他现在正忙于找女朋友没时间写,于是找到了聪明的你,希望你能够写一个程序来解决这个问题。

Input


四个正整数n,m,x,yn,m,x,y,1 \leq n,m,x,y\leq 1e121≤n,m,x,y≤1e12,且n\leq m,x\leq yn≤m,x≤y。

Output


输出gcd(f_{n-1}\times f_{m} + f_{n}\times f_{m+1},f_{x-1}\times f_{y}+f_{x}\times f_{y+1})gcd(fn−1×fm+fn×fm+1,fx−1×fy+fx×fy+1)对1e9+71e9+7取模后的结果。

Sample Input 1 

7 9 5 11

Sample Output 1

987

Sample Input 2 

2531 8344 16981 20081

Sample Output 2

879370834

Source

长沙理工大学第十四届程序设计竞赛

这题我是真不会,只推出来fn是斐波那契数

看官方题解:

设 n ≥ 3,则有:

fn =

⌊n+1 2 ⌋−1 ∑ i=0

Ci n−i−1

fn−1 =

⌊n 2⌋−1 ∑ i=0

Ci n−i−2

fn−2 =

⌊n−1 2 ⌋−1 ∑ i=0

Ci n−i−3

我们将 fn−1 和 fn−2 相加:

fm + fm

=

n−2 ∑ i=0

Ci n−2−i +

n−3 ∑ i=0

Ci n−3−i

=C0 n−2 + C1 n−3 + C2 n−4 +……+ Cn−3 1 + Cn−2 0 + C0 n−3 + C1 n−4 +……+ Cn−4 1 + Cn−3 0 =C0 n−2 + (C1 n−3 + C0 n−3) + (C2 n−4 + C1 n−4) +……+ (Cn−3 1 + Cn−4 1 ) + (Cn−2 0 + Cn−3 0 )

=C0 n−2 +

n−2 ∑ i=1

Ci n−i−1

=C0 n−1 +

n−2 ∑ i=1

Ci n−i−1 + Cn−1 0

=

n−1 ∑ i=0

Ci n−1−i

=fn

因此我们可以得知 fn =

⌊n+1 2 ⌋−1 ∑ i=0

Ci n−i−1

为斐波那契数列的第 n 项,且

f(1)=f(2)=1。 二. 接下来我们证明斐波那契数列的部分性质 1.gcd(fn,fn+1) = 1

5 有趣的数学题 10

证明:

gcd(fn,fn+1) =gcd(fn,fn+1 −fn) =gcd(fn,fn−1) =……

=gcd(f1,f2)

=1

2.fm = fm−n−1 ×fn + fm−n ×fn+1 证明: 假设 n < m,且 fn = a,fn+1 = b。 则 fn+2 = a + b,fn+3 = a + 2b,fn+4 = 2a + 3b。 我们可以发现a和b前面的系数就是一个斐波那契数列,因此 fm = fm−n−1 ×a + fm−n ×b,得证。 推论:fn+m = fm−1 ×fn + fm ×fn+1 3.gcd(fn,fm) = fgcd(n,m) 证明: 由性质 2 我们知道 gcd(fn,fm) = gcd(fn,fm−n−1 ×fn +fm−n ×fn+1)。 又我们知道 fn|fm−n−1 ×fn,由性质一我们知道 gcd(fn,fn+1) = 1,因 此 gcd(fn,fm) = gcd(fn,fn−m) 根据该等式我们即可得证该性质成立。 三. 结果 综合一、二我们可以知道最终答案为 fgcd(n+m,x+y),又由于 n,m,x,y 的数据范围太大,因此我们不能使用斐波那契数列的递推式来得到最终答 案,但是因为 fn 的表达式与 fn−1 和 fn−2 有关,所以我们可以采用矩阵快 速幂来求解。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=2;
const ll mod=1e9+7;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
struct Matrix
{
ll mat[MAXN][MAXN];
Matrix() {}
Matrix operator*(Matrix const &b)const
{
Matrix res;
memset(res.mat, 0, sizeof(res.mat));
for (int i = 0 ;i < MAXN; i++)
for (int j = 0; j < MAXN; j++)
for (int k = 0; k < MAXN; k++)
res.mat[i][j] = (res.mat[i][j]+this->mat[i][k] * b.mat[k][j])%mod;
return res;
}
};
Matrix pow_mod(Matrix base, ll n)
{
Matrix res;
memset(res.mat, 0, sizeof(res.mat));
for (int i = 0; i < MAXN; i++)
res.mat[i][i] = 1;
while (n > 0)
{
if (n & 1) res = res*base;
base = base*base;
n >>= 1;
}
return res;
}
Matrix base,fi;
int main()
{

base.mat[0][0] = 1;
base.mat[0][1] = 1;
base.mat[1][0] = 1;
fi.mat[0][0]=1;
fi.mat[1][0]=1;
ll n,m,x,y;
while(cin>>n>>m>>x>>y)
{
ll nn=gcd(n+m,x+y);
if(nn<=2)
{
printf("1\n");
continue;
}
Matrix ans = pow_mod(base, nn-2);
ans=ans*fi;
printf("%lld\n", ans.mat[0][0]);
}
return 0;
}

谁来帮帮赛小息

Description


在公元2110年,地球不可再生资源面临枯竭。当时距离地球能源完全枯竭,还有三千六百五十天,环境污染问题已经严重威胁到人类生活。为了解决能源危机,为了寻找更优的生存环境,为了探索更佳能源物资,科学家们开始了赛尔机器人的研究工作。这是一个集合了全世界所有优秀科学家的科研组,联合国给他们提供了最好的研究环境、最丰富的环境资源。在全世界无数双眼睛的关注下,人类制造出了赛尔机器人,带来了希望和梦想的翅膀。人们将那一年改元为赛尔元年,以此提醒所有的人,宇宙探索任重而道远。

有一天,赛小息一行来到一个神奇的星球,这个星球有一种十分稀有的精灵。

这种精灵总共有nn种形态,第ii种形态有h_ihi只眼睛,x_ixi只犄角,为了躲避天敌的攻击,它们拥有一种变身技能,可以让他们切换自己的形态。但是由于一些缺陷,导致它们每次切换形态都只能往犄角多的形态进行切换,且切换前后眼睛的变换范围为[h_{i}-w,h_{i}+w][hi−w,hi+w]。

经过多日观察,赛小息他们得知这种精灵的nn种形态的眼睛数量和犄角数量,现在卡璐璐跑来问赛小息这种精灵最多可以切换多少种状态?为了不在卡璐璐面前丢脸,赛小息偷偷通过通讯机将这种精灵的每种状态的情况告诉你,希望你能编写一个程序来解决这个问题。

Input


第一行两个正整数n,w,1\leq n\leq 5000,1\leq w \leq 1000000n,w,1≤n≤5000,1≤w≤1000000,分别表示有nn种形态,每次切换眼睛变换范围不能超过ww。

第二行共有nn个正整数h_{i}hi,表示第ii种形态有h_{i}hi只眼睛,1\leq h_i\leq 10000001≤hi≤1000000。

第三行共有nn个正整数x_{i}xi,表示第ii种形态有x_{i}xi只犄角,1\leq x_i\leq 10000001≤xi≤1000000。

Output


输出一个正整数,表示这种精灵最多可以切换多少种形态。

Sample Input 1 

5 5
1 2 3 4 5
5 3 2 1 4

Sample Output 1

4

Sample Input 2 

5 1
1 2 3 4 5
5 3 2 1 4

Sample Output 2

3

Sample Input 3 

5 5
1 2 3 4 5
2 2 2 2 2

Sample Output 3

0

Hint

用数对(x,y)(x,y)表示xx只眼睛yy只犄角。

样例一:

最优解为初始形态为(4,1)(4,1), 那么它可以切换四次:(4,1)->(3,2)->(2,3)->(5,4)->(1,5)(4,1)−>(3,2)−>(2,3)−>(5,4)−>(1,5)。

Source

长沙理工大学第十四届程序设计竞赛

一道简单的 dp题,

枚举当前点,遍历之前的点来找最大的变化路径 更新当前点

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e3+10;
struct node
{
int h,x;
bool operator <(const node &o) const
{
return x<o.x;
}
}a[N];
struct node1
{
int hh,xx,num;
}dp[N];
int n,w;
int main()
{
cin>>n>>w;
for(int i=1;i<=n;i++)
scanf("%d",&a[i].h);
for(int i=1;i<=n;i++)
scanf("%d",&a[i].x);
sort(a+1,a+1+n);
// for(int i=1;i<=n;i++) printf("A[i].x:%d\n",a[i].x);
for(int i=1;i<=n;i++)
for(int j=0;j<i;j++)
{
if(j==0||dp[j].xx<a[i].x&&abs(dp[j].hh-a[i].h)<=w)
{
if(dp[i].num<dp[j].num+1)
{
dp[i].num=dp[j].num+1;
dp[i].hh=a[i].h;
dp[i].xx=a[i].x;
}
}
}
int ans=0;
for(int i=1;i<=n;i++)
{
ans=max(ans,dp[i].num);
}
printf("%d\n",ans-1);
}

“是时候表演真正的技术了”

Description


众所周知,伊泽瑞尔是一位自信十足的探险家,他寻求冒险的足迹遍布符文之地。

这一天,他来到了一个古老的金字塔前面,他通过观察发现金字塔四周的墙壁上总共有nn个入口。

他使用最先进的探测设备探测到这个金字塔内部有nn个密室,为了方便区分,伊泽瑞尔将这nn个密室按1,2,3,...,n1,2,3,...,n进行了标号。同时他探测到其中有kk个密室是有宝物的,这nn个密室由mm条通道连接起来,且任意两个密室都至少有一条路径可以互达,而墙外的nn个入口可以进入这nn个对应的密室(比如从第ii个入口进入就到达了编号为ii的密室)。

现在伊泽瑞尔想知道,如果他从第xx个入口进入金字塔,那么他走到离他最近有宝物的密室需要多长时间。(如果xx这个密室里已经有宝物的话,就不用继续去别的密室了)

“没有时间可以浪费了!”

Input


第一行输入三个整数n,m,kn,m,k,代表有nn个密室,mm条通道,有kk个有宝物的密室

第二行输入kk个整数,代表那kk个有宝物的密室

接下来m行,每行三个整数u,v,wu,v,w,代表密室uu和密室vv之间有一条通道,走过这条通道所需要的时间是ww。

接下来一行输入一个整数qq,代表有qq次询问。

接下来qq行,每行输入一个整数xx。

数据范围:

1<=n<=10^5,\;1<=m<=3*10^5,\;1<=k<=2000;1<=n<=105,1<=m<=3∗105,1<=k<=2000;

1<=u,v<=n,\;0<=w<=10^9;1<=u,v<=n,0<=w<=109;

1<=q<=10^5,\;1<=x<=n.1<=q<=105,1<=x<=n.

Output


对于每次询问,输出一个答案。

Sample Input 1 

5 6 1
3
1 2 4
3 2 8
3 4 4
2 4 2
3 1 3
3 5 5
5
1
2
3
4
5

Sample Output 1

3
6
0
4
5

Source

长沙理工大学第十四届程序设计竞赛

一道最短路的题,以前好像做过类似的,从终点出发,遍历周围的点

队友A的

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
struct edge
{
int v;
ll w;
int next;
}e[7*N];
int head[N*7],cnt=0;
int n,m,k,s[3000];
ll dis[N];
void read(ll &x){
char ch = getchar();x = 0;
for (; ch < '0' || ch > '9'; ch = getchar());
for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
}

struct node
{
int u;
ll d;
bool operator<(const node &o)const
{
return d>o.d;
}
};
void ins(int u,int v,ll w)
{
e[++cnt]=(edge){v,w,head[u]},head[u]=cnt;
e[++cnt]=(edge){u,w,head[v]},head[v]=cnt;
}
priority_queue<node>Q;
void dijstra()
{
for(int i=0;i<=n;i++) dis[i]=1e15+10;
for(int i=1;i<=k;i++) dis[s[i]]=0,Q.push((node{s[i],0}));
while(!Q.empty())
{
node fr=Q.top();Q.pop();
int u=fr.u;
ll d=fr.d;
int v;
ll w;
if(d!=dis[u]) continue;
for(int i=head[u];i;i=e[i].next)
{
w=e[i].w;
v=e[i].v;
if(dis[u]+w<dis[v])
{
dis[v]=dis[u]+w;
Q.push((node){v,dis[v]});
}
}
}
}
int input(){
int x=0,f=0;char ch=getchar();
while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return f?-x:x;
}
int main()
{
n=input();
m=input();
k=input();
for(int i=1;i<=k;i++)
s[i]=input();
int u,v;
ll w;
for(int i=1;i<=m;i++)
{
u=input();
v=input();
w=input();
ins(u,v,w);
}
dijstra();
int q,a;
q=input();
for(int i=1;i<=q;i++)
{
a=input();
printf("%lld\n",dis[a]);
}
}


论演员的自我修养

Description


小明在看了周星驰的《喜剧之王》后十分感动,决定做一个潜心修炼,做一个优秀的演员,于是他立马跑到书店去买《一个演员的自我修养》这本书。

书店老板老王告诉小明他的书店一共有n\times mn×m本书,被放在了一个nn行mm列的书架上面,每一个格子放一本书。

现在我们已知《一个演员的自我修养》这本书位于(x,y)(x,y)这个位置,小明初始时位于(1,1)(1,1)这个位置。

作为一个 优秀 鶸的acmer选手,小明可以在一步内到达书架的任意一个位置,但是 机智 愣头青的小明只会往比他当前所处点(X,Y)(X,Y)的XX、YY都变大的方向移动,问小明有多少种不同的方法找到《一个演员的自我修养》这本书。

Input


输入四个正整数n,m,x,yn,m,x,y,其中1\leq n\leq 1000001≤n≤100000,1\leq m\leq1000001≤m≤100000,1\leq x\leq n1≤x≤n,1\leq y\leq m1≤y≤m。

Output


输出小明从点(1,1)(1,1)出发到点(x,y)(x,y)的方法数,由于方案数可能比较大,所以请输出答案对1e9+71e9+7取模后的结果。

Sample Input 1 

10 10 4 5

Sample Output 1

10

Source

长沙理工大学第十四届程序设计竞赛

这就那个让我们自闭的杨辉三角的题,斜着看 图片好像传不上来





#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll powmod(ll a,ll b) {ll res=1;a%=mod;
assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll f(ll x){
ll r=1;
for(int i=2;i<=x;i++)r=r*i%mod;
return r;
}
ll getC(ll n,ll m){
return f(n)*powmod(f(n-m)*f(m)%mod,mod-2)%mod;
}

int main()
{
ll x,y,n,m;
cin>>x>>y>>n>>m;
if(n<m) swap(n,m);
if(n==1||m==1)
{
printf("0\n");
return 0;
}
n--,m--;
ll fm=n+m-2;
ll fz=m-1;
ll ans=getC(fm,fz);
printf("%lld\n",ans);
}
/*
2 2 2 99999
*/
/*
10 10 1 1
10 10 2 2
10 10 3 3
10 10 4 4
*/

Magica

Description


魔法师可以施展许多神奇的魔法,每种魔法都对应着一串咒语。咒语是一串长度为nn的字符串,且仅包含大写英文字母。

但是,并不是任意的字母排列都可以作为咒语,魔法师们有mm条禁语(禁语的长度不超过nn),如果咒语以禁语开头,魔法师会受到严重的反噬,所以魔法师不能使用它们(包括禁语本身)。

例如,当“MAGICA”作为禁语的时候,所有以“MAGICA”开头的咒语都不能使用(包括“MAGICA”)。

现在,一名新入职的魔法师好奇自己能使用多少种魔法,聪明的你能帮他算一算吗。

Input


第一行只有一个整数TT,表示有TT组测试(1<=T<=1001<=T<=100)。

每组测试的第一行包含两个整数nn和mm,以空格分隔(1<=n<=101<=n<=10, 1<=m<=min(26^n, 1500)1<=m<=min(26n,1500));

接着是mm行禁语,每行包含一个长度不超过nn的大写英文字符串,代表一条禁语。

数据保证mm条禁语各不相同。

Output


输出包含TT行。每行一个整数,代表魔法师能使用的咒语有多少个。

Sample Input 1 

2
2 3
A
NS
EA
5 3
QAQ
ORZ
TXDY

Sample Output 1

648
11879998

Hint

众所周知,大写英文字母有26个。

Source

长沙理工大学第十四届程序设计竞赛

这题 注意  QQ 和QQA 只需要去掉QQ就可以了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
char s[1600][12];
bool vis[1600];
int n,m;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
ll powmod(ll a,ll b) {ll res=1;
assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a;a=a*a;}return res;}
bool getpre(char *s1,char *s2)
{
int l1=strlen(s1);
int l2=strlen(s2);
if(l1>l2) return 0;
for(int i=0;i<l1;i++)
{
if(s1[i]!=s2[i]) return 0;
}
return 1;
}
int main()
{
int t;
cin>>t;
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++) vis[i]=0;
ll ans=powmod(26,n);
for(int i=1;i<=m;i++) scanf("%s",s[i]);
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
{
if(i==j) continue;
bool f=getpre(s[i],s[j]);
if(f==1) vis[j]=1;
}
for(int i=1;i<=m;i++)
if(vis[i]==0)
{
int len=strlen(s[i]);
ans-=powmod(26,n-len);
}
if(ans<0) printf("0\n");
else printf("%lld\n",ans);
}
return 0;
}
/*
2
2 3
A
NS
EA
5 3
QAQ
ORZ
TXDY
*/

如果爱有颜色

Description


那一定是蓝色!

给定一个字符串,将所有大小写形式的子串"remrem"和所有的子串"486486"改成"RemRem",不包括引号。

Input


第一行一个整数T,表示输入组数。(1\leq T\leq 1001≤T≤100)

接下来T行,每行一个字符串,由大小写字母和数字组成,长度小于1008610086

Output


输出TT行,每行输出修改后的字符串

Sample Input 1 

1
123486759rEmandReM

Sample Output 1

123Rem759RemandRem

Source

长沙理工大学第十四届程序设计竞赛

这个水题就我A的了,一人一个正好

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=10086+10;
char s[N];
int main()
{
int t;
cin>>t;
while(t--){
cin>>s+1;
int len=strlen(s+1);
for(int i=1;i+2<=len;i++)
{
if(s[i]=='r'||s[i]=='R')
{
if(s[i+1]=='e'||s[i+1]=='E')
{
if(s[i+2]=='m'||s[i+2]=='M')
{
s[i]='R';
s[i+1]='e';
s[i+2]='m';
}
}
}


if(s[i]=='4'&&s[i+1]=='8'&&s[i+2]=='6')
{
s[i]='R';
s[i+1]='e';
s[i+2]='m';
}
}
cout<<s+1<<endl;
}
}