1363 - Joseph's Problem

假设k / i 与 k / (i + 1)的值相同, 那么  k / i = k / (i + 1) = q, 则:k % i = k - q * i = p,   k % (i + 1) = k - k - q * i - q = p - q;

即: 对于同一个商来说, 余数组成一个递减的等差数列, 公差就是 k / i;

View Code
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<string>
 4 #include<cstring>
 5 #include<cstdlib>
 6 #include<iomanip>
 7 #include<map>
 8 #include<set>
 9 #include<vector>
10 #include<algorithm>
11 #include<cmath>
12 using namespace std;
13 
14 const int maxn = 100000 + 100;
15 
16 int main()
17 {
18    // freopen("in.txt", "r", stdin);
19     //freopen("out.txt", "w", stdout);
20     long long n , k;
21     while(cin >> n >> k)
22     {
23         long long ans = 0;
24         long long i = 1;
25         while(i <= n)
26         {
27             long long j = k / i;
28             long long r = k % i;
29             if(j == 0)
30             {
31                 ans += r * (n - i + 1);
32                 i = n + 1;
33             }
34             else
35             {
36                 long long s = r / j;
37                 if(s + 1 > n - i + 1) s = n - i;
38                 ans += (r + r - s * j) * (s + 1) / 2;
39                 i += s + 1;
40             }
41         }
42         cout << ans << endl;
43     }
44     return 0;
45     return 0;
46 }

 

posted @ 2013-01-29 21:17  ACSeed  Views(109)  Comments(0)    收藏  举报