4 条题解

  • 1
    @ 2021-9-30 11:46:26

    作为NOIP复赛这题太客气了。不需要动态规划,帖个o(m/n)(可以这么写么?)的算法。

    #include <bits/stdc++.h>
    using namespace std;
    __int128 f[31] = {1};
    __int128 step_combination(int a, int b) 
        { return f[a + b] / f[a] / f[b]; }
    int main() {
        int n, m;
        cin >> n >> m;
        __int128 fratorial = 1;
        for (int i = 1; i <= 30; i++) 
            fratorial *= i, f[i] = fratorial;
        __int128 res = 0;
        if (m % 2 == 0) res = step_combination(m / 2, m / 2);
        for (int i = n; i <= m; i += n) {
            if ((m - i) & 1) continue;
            res += 2 * step_combination(
                (m - i) / 2, i + (m - i) / 2);
        }
        // print __int128 
        vector<int> res_digits;
        while (res > 0) {
            res_digits.push_back(res % 10);
            res /= 10;
        }
        if (res_digits.size() == 0) res_digits.push_back(0);
        for (int i = res_digits.size() - 1; i >= 0; i--) 
            cout << res_digits[i];
    }
    
    • -2
      @ 2022-4-24 18:58:07

      写题解请注意

      鼓励大家写题解,但注意题解格式。

      题解一定要有思路解析或代码注释,能否让别人理解你的思路

      也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

      给代码两端加上这个会舒服一些

      ```cpp

      你的代码

      ```

      </span>

      这个点在键盘的左上角tab上面那个键,注意切换输入法

      #include<iostream>
      using namespace std;
      int main()
      {
          int n;
          cin>>n;//这是一个注释
          return 0;
      } 
      

      请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

      抄袭题解一经发现直接取消成绩。

      题解被删除的可能

      1. 代码不符合格式规范
      2. 没有思路讲解或者没有注释,
      3. 无意义的题解

      大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

      • -3
        @ 2022-4-19 22:33:53

        严禁抄题解,发现后取消成绩

        • -3
          @ 2022-3-10 0:44:21
          
          基本的dp,设f[i][j]为第i次传球传到位置j的方案数
          每次可从左边或者右边传来,处理一下两个左右端点即可
          #include<bits/stdc++.h>
          using namespace std;
          int n,m,f[35][35];//f[i][j]为第i次传球传到位置j的方案数 
          int main()
          {
          	ios::sync_with_stdio(false);
          	cin.tie(0);
          	cin>>n>>m;
          	f[0][1]=1;
          	for(int i=1;i<=m;i++)
          	{
          		for(int j=1;j<=n;j++)
          		{
          			if(j==1)//传到位置1只能是位置n或者位置2传来
          			{
          				f[i][j]=f[i-1][n]+f[i-1][2];
          			} 
          			if(j>1&&j<n)//中间位置就是左右传来即可
          			{
          				f[i][j]=f[i-1][j-1]+f[i-1][j+1];
          			} 
          			if(j==n)
          			{
          				f[i][j]=f[i-1][1]+f[i-1][n-1];
          			}
          		}
          	}
          	cout<<f[m][1];
          	return 0; 
          }
          • 1

          信息

          ID
          797
          时间
          1000ms
          内存
          50MiB
          难度
          1
          标签
          递交数
          90
          已通过
          63
          上传者