poj 2668 -- Defending Castle解題報告
原文:http://blog.csdn.net/zsc09_leaf/archive/2011/03/30/6289856.aspx
Description
The kingdom Eintagra is in great danger! Overwhelming enemy has surrounded the emperor's castle and once they enter, a massacre is just what is going to be.
Now what all people in the kingdom Eintagra can rely on, is a huge catapult that can throw heavy rocks to the crowd of enemy. The catapult is so huge that it is too hard to adjust the direction it targets. So the damage it can do to the enemy is decreasing for every throw because the enemy in the targeted area are going to move away. If on the first attack it can make a certain damage, then on the second it can do only half, and 1/3 the damage on the third attack, and this holds, by estimation, that the K-th attack does 1/K damage of the first attack can do. People are optimistic so if the damage is not an integer, they round it up to the nearest bigger integer.
Given the damage of the first attack of the catapult and the life of the catapult, people need to know how much total damage the catapult can do to the enemy.
Input
There are multiple test cases. Each contains two positive integers D and N in a single line, where D is the damage of the first attack of the catapult, and N is its life measured by the number of attacks it can make. D and N are both positive integers and not more than 2000000000.
Input ends with two zeros and this line should not be processed.
Output
Output a single line with an integer reporting the total damage that the catapult can do to the enemy.
Sample Input
1 1
2 3
0 0
Sample Output
1
4
Source
Beijing 2005 Preliminary
Author:nealzane
文章很廢話
說的就是已知d,n 求解d/1+d/2+d/3+....+d/n并且每個數都取上整
一開始讀到這題沒什么想法,想了好一會兒
舉例:
d=7,n=7
則數列為
7 4 3 2 2 2 1
1 2 3 4 5 6 7
可以發現一個規律
d/i 向上取整的值表示的是 d/k=i的起始位置
例如: 7/1=7, 則7/k=1, k從7開始
又比如 7/2=4, 則 7/k=2 , k從4開始
因此我們可以獲得一個 d/k=i 的一個區間
- #include <iostream>
- using namespace std;
- int main()
- {
- __int64 sum=0,b=0,s=0,e=0,num,d,n,i;
- while(scanf("%I64d%I64d",&d,&n),d+n!=0)
- {
- sum=0;
- i=1;
- e=n; //終點初始化為n
- while(1)
- {
- s=(d-1)/i+1; //求出值為 i的起始位置s
- sum+=s;
- if(s==i) //避免s=e造成重復加
- s++;
- if(s<=n)
- {
- e=n<e?n:e; //判斷有效區間
- sum+=(e-s+1)*i; //加上相應的值
- }
- e=s-1; //更新下個區間的末端
- if(e<=i||i>=n) //跳出條件
- break;
- i++;
- }
- printf("%I64d\n",sum);
- }
- }
posted on 2011-04-19 21:27 pp_zhang 閱讀(414) 評論(0) 編輯 收藏 引用 所屬分類: 數論