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 }


浙公网安备 33010602011771号