A simple problem | ||
Accepted : 61 | Submit : 418 | |
Time Limit : 15000 MS | Memory Limit : 655360 KB |
Problem DescriptionThere is a simple problem. Given a number N. you are going to calculate N%1+N%2+N%3+...+N%N. InputFirst line contains an integer T, there are T(1≤T≤50) cases. For each case T. The length N(1≤N≤1012). OutputOutput case number first, then the answer. Sample Input1 5 Sample OutputCase 1: 4 |
寻找&星空の孩子
ps:http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1203
#include <iostream>
#include <cstdio>
#include <cstring>
#include <climits>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <list>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <functional>
#include <complex>
#define mp make_pair
#define X first
#define Y second
#define MEMSET(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vi::iterator vi_it;
typedef map<int, int> mii;
typedef priority_queue<int> pqi;
typedef priority_queue<int, vector<int>, greater<int> > rpqi;
typedef priority_queue<pii> pqp;
typedef priority_queue<pii, vector<pii>, greater<pii> > rpqp;
const int MAX_N = 100000 + 2;
const ll LL = 1000000000;
int a[MAX_N];
struct bigNum
{
ll bit[3];
bigNum() {
}
bigNum(const ll &b = 0) {
bit[0] = b % LL;
bit[1] = b / LL;
bit[2] = 0;
}
void format() {
bit[1] += bit[0] / LL;
bit[0] %= LL;
bit[2] += bit[1] / LL;
bit[1] %= LL;
}
bigNum operator * (const bigNum &bg) const {
bigNum tmp(0);
for (int i = 0; i < 3; ++i) {
for (int j = 0; j <= i; ++j) tmp.bit[i] += bit[j] * bg.bit[i - j];
}
tmp.format();
return tmp;
}
void operator = (const bigNum &bg) {
for (int i = 0; i < 3; ++i) bit[i] = bg.bit[i];
}
void operator *= (const bigNum &bg) {
*this = *this * bg;
}
bigNum operator + (const bigNum &bg) const {
bigNum tmp(0);
for (int i = 0; i < 3; ++i) tmp.bit[i] = bit[i] + bg.bit[i];
tmp.format();
return tmp;
}
void operator += (const bigNum &bg) {
*this = *this + bg;
}
void half() {
if (bit[2] % 2) bit[1] += LL;
bit[2] /= 2;
if (bit[1] % 2) bit[0] += LL;
bit[1] /= 2;
bit[0] /= 2;
}
void print() {
bool flag = false;
if (bit[2]) printf("%I64d", bit[2]), flag = true;
if (flag) printf("%09I64d", bit[1]);
else if (bit[1]) printf("%I64d", bit[1]), flag = true;
if (flag) printf("%09I64d", bit[0]);
else printf("%I64d", bit[0]);
}
};
int main(int argc, char *argv[])
{
// freopen("D:\\in.txt", "r", stdin);
int t;
cin >> t;
for (int cas = 1; cas <= t; ++cas) {
ll n;
scanf("%I64d", &n);
bigNum bn(n), ans(0);
int k = (int)sqrt((double)n);
for (int i = 1; i <= k; ++i) {
bigNum tmp1(n / i - n / (i + 1));
bigNum tmp2(n + n - i * (n / i + n / (i + 1) + 1));
tmp1 *= tmp2;
tmp1.half();
ans += tmp1;
}
ll tmp(0);
int lmt = (int)(n / (k + 1));
for (int i = 1; i <= lmt; ++i) tmp += n % i;
bigNum tt(tmp);
ans += tt;
printf("Case %d: ", cas);
ans.print();
puts("");
}
return 0;
}