2018CCPC吉林赛区(重现赛)A. The Fool

it2022-05-05  215

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6555

解题心得:题意很简单,当时我队友一看就说这是个傻b题,然后秒了,然后比赛完后我看了好一会儿总发现复杂度不对。其实这个题就是把商为 1 、 2 、 3..... 1、2、3..... 123.....的部分用 O ( 1 ) O(1) O(1)复杂度找出来,然后求和就行了,打个表看了一下复杂度大概是 2 ∗ s q r t ( n ) 2*sqrt(n) 2sqrt(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; }

最新回复(0)