E. Riding in a Lift(Codeforces Round #274)

本文探讨了一个特定的算法问题:在一栋有n层楼的大楼里,从a层出发,在不经过b层的情况下,进行k次楼层间移动的不同路径数量。通过动态规划的方法解决了这一问题,并给出了详细的实现代码。
E. Riding in a Lift
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Imagine that you are in a building that has exactly n floors. You can move between the floors in a lift. Let's number the floors from bottom to top with integers from 1 to n. Now you're on the floor number a. You are very bored, so you want to take the lift. Floor number b has a secret lab, the entry is forbidden. However, you already are in the mood and decide to make k consecutive trips in the lift.

Let us suppose that at the moment you are on the floor number x (initially, you were on floor a). For another trip between floors you choose some floor with number y (y ≠ x) and the lift travels to this floor. As you cannot visit floor b with the secret lab, you decided that the distance from the current floor x to the chosen y must be strictly less than the distance from the current floor x to floor b with the secret lab. Formally, it means that the following inequation must fulfill: |x - y| < |x - b|. After the lift successfully transports you to floor y, you write down number y in your notepad.

Your task is to find the number of distinct number sequences that you could have written in the notebook as the result of k trips in the lift. As the sought number of trips can be rather large, find the remainder after dividing the number by 1000000007 (109 + 7).

Input

The first line of the input contains four space-separated integers nabk (2 ≤ n ≤ 50001 ≤ k ≤ 50001 ≤ a, b ≤ na ≠ b).

Output

Print a single integer — the remainder after dividing the sought number of sequences by 1000000007 (109 + 7).

Sample test(s)
input
5 2 4 1
output
2
input
5 2 4 2
output
2
input
5 3 4 1
output
0
Note

Two sequences p1, p2, ..., pk and q1, q2, ..., qk are distinct, if there is such integer j (1 ≤ j ≤ k), that pj ≠ qj.

Notes to the samples:

  1. In the first sample after the first trip you are either on floor 1, or on floor 3, because |1 - 2| < |2 - 4| and |3 - 2| < |2 - 4|.
  2. In the second sample there are two possible sequences: (1, 2)(1, 3). You cannot choose floor 3 for the first trip because in this case no floor can be the floor for the second trip.

  1. In the third sample there are no sought sequences, because you cannot choose the floor for the first trip.


上次的cf今天才补题o(╯□╰)o,给n层楼。在a层開始,不能在b层停,且当在x层去y层时。|x - y| < |x - b|,求运行k
 
次的方案数。

有两种情况,dp[i][j],i为第i次,j为当前停的层数。


 当a<b时,此时全部的x不会超过b,当第i次停在j层。第i-1次肯定在[0,(b+j-1)/2],左端点不难想到,右端点推导过程:

设第i-1次停在x层。则第i层全部大于x小于b的点都能够取。我们仅仅考虑小于x的点。则x-j<=b-x-1,

整理得:   x<=(b+j-1)/2; 所以转移方程为:dp[i][j]=(sum[i-1][(j+b-1)/2]-dp[i-1][j]+mod)%mod;

当a>b时,同理得dp[i][j]=((sum[i-1][n]-sum[i-1][(j+b)/2]+mod)%mod-dp[i-1][j]+mod)%mod;

代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=5000+100;
const int mod=1000000000+7;
int dp[maxn][maxn];
int sum[maxn][maxn];
int n;
void getsum(int x)
{
    for(int i=1;i<=n;i++)
    {
    sum[x][i]=(sum[x][i-1]+dp[x][i])%mod;
  //  printf("%I64d\n",sum[x][i]);
    }
}
int main()
{
    int a,b,k;
    scanf("%d%d%d%d",&n,&a,&b,&k);
    memset(dp,0,sizeof(dp));
    memset(sum,0,sizeof(sum));
    dp[0][a]=1;
    if(a<b)
    {
        getsum(0);
       for(int i=1;i<=k;i++)
       {
        for(int j=1;j<b;j++)
        {
           dp[i][j]=(sum[i-1][(j+b-1)/2]-dp[i-1][j]+mod)%mod;
          // printf("%I64d ",dp[i][j]);
        }
      // printf("\n");
        getsum(i);
       }
    }
    else
    {
        getsum(0);
        for(int i=1;i<=k;i++)
        {
            for(int j=b+1;j<=n;j++)
            {
                //printf("%d %d\n",sum[i-1])
                dp[i][j]=((sum[i-1][n]-sum[i-1][(j+b)/2]+mod)%mod-dp[i-1][j]+mod)%mod;
               // printf("%d ",dp[i][j]);
            }
            getsum(i);
        }
    }
    long long ans=0;
    for(int i=1;i<=n;i++)
    {
    ans=(ans+dp[k][i])%mod;
    //printf("%d ",dp[k][i]);
    }
    printf("%I64d\n",ans);
    return 0;
}


为下面的代码 每行代码都 添加中文注释 , 每个函数都进行详细注释 , 代码的算法原理也写在注释中 , 原来的英文注释翻译成中文注释 : ```from sentence_transformers.cross_encoder import CrossEncoder # 1. Load a pretrained CrossEncoder model model = CrossEncoder("cross-encoder/stsb-distilroberta-base") # We want to compute the similarity between the query sentence... query = "A man is eating pasta." # ... and all sentences in the corpus corpus = [ "A man is eating food.", "A man is eating a piece of bread.", "The girl is carrying a baby.", "A man is riding a horse.", "A woman is playing violin.", "Two men pushed carts through the woods.", "A man is riding a white horse on an enclosed ground.", "A monkey is playing drums.", "A cheetah is running behind its prey.", ] # 2. We rank all sentences in the corpus for the query ranks = model.rank(query, corpus) # Print the scores print("Query: ", query) for rank in ranks: print(f"{rank[&#39;score&#39;]:.2f}\t{corpus[rank[&#39;corpus_id&#39;]]}") """ Query: A man is eating pasta. 0.67 A man is eating food. 0.34 A man is eating a piece of bread. 0.08 A man is riding a horse. 0.07 A man is riding a white horse on an enclosed ground. 0.01 The girl is carrying a baby. 0.01 Two men pushed carts through the woods. 0.01 A monkey is playing drums. 0.01 A woman is playing violin. 0.01 A cheetah is running behind its prey. """ # 3. Alternatively, you can also manually compute the score between two sentences import numpy as np sentence_combinations = [[query, sentence] for sentence in corpus] scores = model.predict(sentence_combinations) # Sort the scores in decreasing order to get the corpus indices ranked_indices = np.argsort(scores)[::-1] print("Scores:", scores) print("Indices:", ranked_indices) """ Scores: [0.6732372, 0.34102544, 0.00542465, 0.07569341, 0.00525378, 0.00536814, 0.06676237, 0.00534825, 0.00516717] Indices: [0 1 3 6 2 5 7 4 8] """```
03-10
【RIS 辅助的 THz 混合场波束斜视下的信道估计与定位】在混合场波束斜视效应下,利用太赫兹超大可重构智能表面感知用户信道与位置(Matlab代码实现)内容概要:本文围绕“IS 辅助的 THz 混合场波束斜视下的信道估计与定位”展开,重点研究在太赫兹(THz)通信系统中,由于混合近场与远场共存导致的波束斜视效应下,如何利用超大可重构智能表面(RIS)实现对用户信道状态信息和位置的联合感知与精确估计。文中提出了一种基于RIS调控的信道参数估计算法,通过优化RIS相移矩阵提升信道分辨率,并结合信号到达角(AoA)、到达时间(ToA)等信息实现高精度定位。该方法在Matlab平台上进行了仿真验证,复现了SCI一区论文的核心成果,展示了其在下一代高频通信系统中的应用潜力。; 适合人群:具备通信工程、信号处理或电子信息相关背景,熟悉Matlab仿真,从事太赫兹通信、智能反射面或无线定位方向研究的研究生、科研人员及工程师。; 使用场景及目标:① 理解太赫兹通信中混合场域波束斜视问题的成因与影响;② 掌握基于RIS的信道估计与用户定位联合实现的技术路径;③ 学习并复现高水平SCI论文中的算法设计与仿真方法,支撑学术研究或工程原型开发; 阅读建议:此资源以Matlab代码实现为核心,强调理论与实践结合,建议读者在理解波束成形、信道建模和参数估计算法的基础上,动手运行和调试代码,深入掌握RIS在高频通信感知一体化中的关键技术细节。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值