A – 生是脂肪的人
分析:打表找规律;
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long LL;
const int maxn = 1010;
double x[maxn], y[maxn];
int main() {
int t;
scanf("%d", &t);
while(t--) {
LL n;
scanf("%lld", &n);
if(n <= 0) { //注意这个
printf("0\n");
continue;
}
if(n % 6 == 1) printf("1\n");
if(n % 6 == 2) printf("4\n");
if(n % 6 == 3) printf("2\n");
if(n % 6 == 4) printf("8\n");
if(n % 6 == 5) printf("5\n");
if(n % 6 == 0) printf("7\n");
}
return 0;
}
B – 死是脂肪的鬼
分析:直接暴力,按照题目模拟题意;
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int maxn = 15;
int ma[maxn][maxn];
int vis[maxn][maxn];
bool dfs(int x, int y) {
int cnt[14];
memset(cnt, 0, sizeof(cnt));
for(int i = x; i <= 2 + x; i++) {
for(int j = y; j <= y + 2; j++) {
vis[i][j] = 1;
cnt[ma[i][j]] = 1;
}
}
for(int i = 1; i <= 9; i++) {
if(!cnt[i]) return false;
}
return true;
}
int main() {
int t;
scanf("%d", &t);
getchar();
while(t--) {
memset(vis, 0, sizeof(vis));
for(int i =1; i <= 9; i++) {
if(i != 1) getchar();
for(int j = 1; j <= 9; j++) {
scanf("%d", &ma[i][j]);
}
}
bool flag = true;
for(int i = 1; i<= 9; i++) {
for(int j = 1; j <= 9; j++) {
if(vis[i][j]) continue;
if(!dfs(i, j)) {
flag = false;
break;
}
}
if(!flag) break;
}
int cnt[15];
for(int i = 1; i<= 9; i++) {
memset(cnt, 0, sizeof(cnt));
for(int j = 1; j <= 9; j++) {
cnt[ma[i][j]] = 1;
}
for(int j = 1; j <= 9; j++) {
if(!cnt[j]) {
flag = false;
break;
}
}
if(!flag) break;
}
for(int i = 1; i<= 9; i++) {
memset(cnt, 0, sizeof(cnt));
for(int j = 1; j <= 9; j++) {
cnt[ma[j][i]] = 1;
}
for(int j = 1; j <= 9; j++) {
if(!cnt[j]) {
flag = false;
break;
}
}
if(!flag) break;
}
if(flag) puts("Yes");
else puts("No");
}
return 0;
}
C – 你居然不吃巧克力
分析:最优情况,每次把小的二合成一。有点二分的意思,遇到无法相同合并时,把零散的从小到大合并(有的用递推写的,道理一样)。
比如n == 1:
第一步:1 1 1 1 1 1 1 1 1 1 1 -》 0
第二步:2 2 2 2 2 1 -》5
第三步:4 4 2 1 -》 9
第四步:8 2 1 -》 13
最后一步:11 -》 13 + 1 + 3 = 17
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int maxn = 15;
int ma[maxn][maxn];
int vis[maxn][maxn];
int dp[10010];
long long quickpow(long long n,long long m)
{
long long ans=1,base=n;
while(m)
{
if(m & 1)
{
ans=(base*ans);
}
base=(base*base);
m>>=1;//m=m/2;
}
return ans;
}
int main() {
int t;
scanf("%d", &t);
while(t--) {
LL n;
scanf("%lld", &n);
LL cnt = 0, sum = 0;
int p = 0;
while(n != 1) {
if(n & 1) {
dp[p++] = quickpow(2, cnt);
}
n >>= 1;
sum = sum + n * quickpow(2, cnt);
cnt++;
}
for(int i = 0; i <= p - 1; i++) {
dp[i + 1] += dp[i];
sum += min(dp[i], dp[i + 1]);
}
printf("%lld\n",sum);
}
return 0;
}
1176 - 别不好意思,都是脂肪的人
Time Limit:2s Memory Limit:128MByte
DESCRIPTION
给定两个正整数 n 和 k请求出:
数据保证答案是一个有理数,我们假设它为
p/q
p
/
q
, 你只需输出它对 1e9+7 的模即可。
INPUT
第一行一个正整数
T
T 表示数据组数。
对于每组数据:
一行两个正整数,表示 n 和 k。
OUTPUT
一共 T行,每行一个正整数,表示答案。
SAMPLE INPUT
1
7 3
SAMPLE OUTPUT
457031313
HINT
数据范围:
1<=T<=1000,1<=n<=1e9,2<=k<=1e9 。
直接给公式了,不会推导:
ans=n∗kn(k−1)(n+1)
a
n
s
=
n
∗
k
n
(
k
−
1
)
(
n
+
1
)
.