Bob 在一旁看 Alice 爬台阶玩, Alice 突发奇想让 Bob 闭上眼记录他爬了多少台阶,规则是这样的: Alice每次会想好爬多少级台阶,每爬一级都会数数,爬完之后走回到最底层,注意走回去的那些台阶是不算级数的。 Bob 闭上眼通过 Alice 的报数来统计 Alice 总共爬了几次,每次爬了多少级。
输入格式
第一行包含一个整数 N(1 ≤ 100000),表示 Alice 的报数次数。
第二行包含 N 个正整数 Ai(1 ≤ Ai ≤ 1000),表示 Alice 的报数序列。
输出格式
第一行包含一个整数,表示 Alice 爬的次数 T。第二行包含 T 个整数,第 i 个整数表示 Alice 每 i 次爬的台阶数。
/* -- Defined Functions -- */ #define For(a,x,y) for (int a = x; a <= y; ++a) #define Bak(a,y,x) for (int a = y; a >= x; --a) #define Forw(a,x,y) for (int a = x; a < y; ++a) usingnamespacestd;
namespace FastIO { voidDEBUG(char comment[], int x){ cerr << comment << x << endl; }
inlineintgetint(){ int s = 0, x = 1; char ch = getchar(); while (!isdigit(ch)) { if (ch == '-') x = -1; ch = getchar(); } while (isdigit(ch)) { s = s * 10 + ch - '0'; ch = getchar(); } return s * x; } inlinevoid __basic_putint(int x) { if (x < 0) { x = -x; putchar('-'); } if (x >= 10) __basic_putint(x / 10); putchar(x % 10 + '0'); }
n = getint(); For (i, 1, n) seq[i] = getint(); Work(); putint(T, '\n'); int siz = cnt.size(); Forw (i, 1, siz - 1) putint(cnt[i], ' '); putint(cnt[siz - 1], '\n');
return0; }
Problem B. remove
题目描述
给出一个字符串 s,字符串中只会包含⼩写字母 a − z。现在需要通过重复下面这个算法 符串中删去 k 个字符: • 如果当前字符串中还存在字符 a,就删去字符串中最前面的一个 a 字符,结束算法 • 如果当前字符串中还存在字符 b,就删去字符串中最前面的一个 b 字符,结束算法 • … • 如果当前字符串中还存在字符 z,就删去字符串中最前面的一个 z 字符,结束算法 求删完 k 个字符后的字符串。
输入格式
第一行包含两个整数 n; k(1 ≤ k ≤ n ≤ 100000), n 表示字符串长度, k 表示删去的字符个数。
/* -- Defined Functions -- */ #define For(a,x,y) for (int a = x; a <= y; ++a) #define Forw(a,x,y) for (int a = x; a < y; ++a) #define Bak(a,y,x) for (int a = y; a >= x; --a) usingnamespacestd;
namespace FastIO { voidDEBUG(char comment[], int x){ cerr << comment << x << endl; }
inlineintgetint(){ int s = 0, x = 1; char ch = getchar(); while (!isdigit(ch)) { if (ch == '-') x = -1; ch = getchar(); } while (isdigit(ch)) { s = s * 10 + ch - '0'; ch = getchar(); } return s * x; } inlinevoid __basic_putint(int x) { if (x < 0) { x = -x; putchar('-'); } if (x >= 10) __basic_putint(x / 10); putchar(x % 10 + '0'); }
intmain(int argc, char *const argv[]){ #ifndef HANDWER_FILE freopen("testdata.in", "r", stdin); freopen("testdata.out", "w", stdout); #endif usingnamespace Solution; string s; cin >> s; len = s.length(); For (i, 1, len) seq[i] = (s[i-1] - '0') % 3; int ans = Work(); cout << ans << endl; return0; }
Problem D. sum
题目描述
某些数有奇怪的性质:它十进制下的各位数的平方和的 T 倍等于它本身。求在 [A, B] 范围内的数有多少满足这个性质
输入格式
第一行包含三个整数 T, A, B(1 ≤ T; A; B ≤ 10^18; A ≤ B)。
输出格式
一个整数,表示满足条件的数量。
输入样例
1
51 500010000
输出样例
1
3
子任务
对于 40% 的数据, 1 ≤ T; A; B ≤ 100000; A ≤ B。 对于 100% 的数据, 1 ≤ T; A; B ≤ 10^18; A ≤ B。
代码实现
此为标程
1 2 3 4 5 6 7 8
longlongcalc(longlong x){ longlong ans = 0; while (x) { ans += (x % 10) * (x % 10); x /= 10; } return ans; }
1 2 3 4 5 6 7 8 9 10 11
longlong k, a, b, ans = 0; scanf("%lld%lld%lld", &k, &a, &b); for(int i = 1; i <= 1600; i++) { if (a <= k * i && i <= b / k) if (calc(k * i) == i) { printf("%lld\n", k * i); ans++; } } printf("%lld\n", ans); return0;