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; }