zoukankan      html  css  js  c++  java
  • SGU 246. Black & White(数论)

    题意:

      有2*n-1个黑色和白色的珠子组成的环形项链,求至少需要多少颗黑色珠子才能使任意排列的项链中都存在两个黑珠间有n个珠子.

          (2*n-1<=2^31-1);

    Solution:

      先分析n=5,n=7,n=9的情况.

          当2*n-1=5,必须有两颗黑珠距离为1(较短的方向).

             2*n-1=7,必须有两颗黑珠距离为2.

             2*n-1=9,必须有两颗黑珠距离为3.

          可以发现 对k=2*n-1,必须存在两颗黑珠的距离为l=(k/2-1)

      假设问题的答案是ans,

          我们先来求ans-1,即最多的不满足问题条件的黑珠数

          假设已经放下了一颗黑珠子位于t。那么距离t+l的地方,t+l*2,t+l*3....这些位置我们可以连起来.显然在在环内每隔1个位置放黑珠能放最多.

              有两种情况,一种是连起来的边只形成了一个环,那么ans-1=(2*n-1)/2,

                             另一种是形成了多个环,那么ans-1=len1/2+len2/2....+leni/2  ,leni为每个环的长度.

          接下来就是数学问题,可以通过求2*n-1,和l的最小公倍数来判断和求出上面所需要的值.

    #include <iostream>
    
    using namespace std;
    int n, ans;
    
    int gcd( int a, int b )
    {
        return b == 0 ? a : gcd( b, a % b );
    }
    int main()
    {
        cin >> n;
        int k = ( n >> 1 ) - 1;
        int d = gcd( n, k );
        int m = n / d, t = n / m;
        ans += t * ( m / 2 );
        n -= t * m;
        ans += n / 2;
        cout << ans + 1 << endl;
    }
    View Code
  • 相关阅读:
    PHP语言结构
    时钟拖放
    CSS定位
    vi命令(转)
    数值转化Excel列字母的函数
    SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY的比较
    数字转化罗马数字的函数
    在VB中如何打开“文件夹选项”对话框?
    纯VB代码取得硬盘的物理序列号 (转)
    项目经理应该做什么
  • 原文地址:https://www.cnblogs.com/keam37/p/4590436.html
Copyright © 2011-2022 走看看