1 条题解

  • 0
    @ 2026-10-19 1:02:28

    [NOIP 2008 普及组] 传球游戏

    知识点

    动态规划、环形状态

    解题思路

    dp[i]表示当前传球次数后球在i号同学的方案数,初态dp[0]=1。每一步把dp[i]分别累加到左右相邻位置。m步后输出dp[0]。

    正确性说明

    任何长k+1的传递方案由唯一的长k前缀和最后一次向左/右传球组成。n≥3使左右邻居不同,两个转移互斥;逐步累加恰好计入所有方案且不重计。

    易错点

    下标按n取模;每一步用新数组,不能在同一层原地传播;计数使用64位。

    复杂度

    时间O(nm),空间O(n)。

    参考代码(GNU C++17)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){int n,m;cin>>n>>m;vector<long long>d(n),v(n);d[0]=1;for(int t=0;t<m;t++){fill(v.begin(),v.end(),0);for(int i=0;i<n;i++)v[(i+1)%n]+=d[i],v[(i+n-1)%n]+=d[i];d.swap(v);}cout<<d[0]<<'\n';}
    
    • 1

    信息

    ID
    883
    时间
    1000ms
    内存
    125MiB
    难度
    普及
    标签
    递交数
    0
    已通过
    0
    上传者