题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6555
解题心得:题意很简单,当时我队友一看就说这是个傻b题,然后秒了,然后比赛完后我看了好一会儿总发现复杂度不对。其实这个题就是把商为 1 、 2 、 3..... 1、2、3..... 1、2、3.....的部分用 O ( 1 ) O(1) O(1)复杂度找出来,然后求和就行了,打个表看了一下复杂度大概是 2 ∗ s q r t ( n ) 2*sqrt(n) 2∗sqrt(n)。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll add(ll n) {
ll Sum = 0;
int cnt = 1;
for(int pos1=1, pos2;pos1<=n;pos1 = pos2+1){//一段一段的找出来
pos2 = n/(n/pos1);
Sum += (pos2-pos1+1)*(n/pos1);
// printf("%d %d %d\n",cnt++, pos2, pos1); 打表看复杂度的
}
return Sum;
}
int main() {
freopen("1.in.txt", "r", stdin);
int t; scanf("%d", &t);
int T = t;
while(t--) {
ll n; scanf("%lld", &n);
ll sum = add(n);
string ans;
if(sum&1) ans = "odd";
else ans = "even";
printf("Case %d: %s\n", T-t, ans.c_str());
}
return 0;
}