Problem A. sum
File: sum.*
Time limit: 1s
Memory limit: 256MB
某些数有奇怪的性质:它十进制下的各位数的平方和的 T 倍等于它本身。求在 [A, B] 范围内的数有多少满足这个性质。
Input
第一行包含三个整数 T, A, B(1 ≤ T, A, B ≤ 1018, A ≤ B)。
Output
一个整数,表示满足条件的的数量。
Examples
Input
Output
51 5000 10000
3
Subtasks
对于 40% 的数据,T, A, B ≤ 100000, A ≤ B。对于 100% 的数据,T, A, B ≤ 1018, A ≤ B。
std:枚举数字,计算量不会超过91818。(我枚举成了[a,b]内的每个数字)
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
ull k,a,b,ans;
int dos(ull);
int main()
{
scanf("%lld%lld%lld",&k,&a,&b);
for(int i=1;i<=2000;i++)
{
if(a <= i*k && i <= b/k)
if(dos(i*k) == i) ans++;
}
printf("%lld",ans);
}
inline int dos(ull x)
{
int cnt=0;
while(x) cnt+=(x%10)*(x%10),x/=10;
return cnt;
}
Problem B. guess
File: guess.*
Time limit: 3s
Memory limit: 256MB
有这样一个赌博游戏:一些奖品被藏在了一排 N 个柜中,每个柜中可能包含零或一个奖品。每次你可以询问第 X 到第 Y 个柜中奖品数量的奇偶性,如果你能够确定所有奖品的位置就可以赢得所有奖品。当然,每次询问都是要付出一定金额的,对区间 [X, Y ] 进行询问需要支付 CX,Y元,求最少需要多少钱可以百分百确定每个奖品的位置。
Input
第一行包含一个整数 N (1 ≤ N ≤ 500),表示柜数量。
接下来 N 行,第 i + 1 行包含 n + 1 − i 个整数,其中第 j 个数表示 Ci,i+j−1。
Output
一个整数,表示最少需要的钱数。
Examples
Input
Output
5 7 1 2 3 4 5 4 3 2 1 3 4 5 2 1 5
Subtasks
对于 40% 的数据,N ≤ 5。对于 60% 的数据,N ≤ 10。
对于 100% 的数据,N ≤ 500 1 ≤ CX,Y≤ 109。
Problem C. xor
File: xor.*
Time limit: 3s
Memory limit: 256MB
给出一个 n × m 的网格,每个格上有权值 ai,j,现在要从 (1, 1) 走到 (n, m),每次只能向右或向下走, 沿路计算异或和,求异或和等于 k 的路径数。
Input
第一行包含三个整数 n, m, k(1 ≤ n, m ≤ 20, 0 ≤ k ≤ 1018)。接下来 n 行,每⾏包含 m 个整数,表⽰⽹格上的权值。
Output
一个整数,表示路径数。
Examples
Input
Output
3 3 11
3 2 1
5 7 10
0 1 2
6 4
Subtasks
对于 30% 的数据,n, m ≤ 4。对于 60% 的数据,n, m ≤ 10。
对于 100% 的数据,n, m ≤ 20, 1 ≤ ai,j≤ 1018, 1 ≤ k ≤ 1018。