A:完全平方数
一个正整数a是一个完全平方数,是指它是某一个整数的平方,即存在一个整数b,使得a = b × b。
现在给出一个区间[m,n],统计在该区间中有多少个完全平方数?输入
单组输入。
输入两个正整数m和n,1<=m<=n<=1000000000,二者之间用一个英文空格隔开。输出
输出在区间[m,n]中包含的完全平方数的个数(包括m和n)。
样例输入 Copy
1 10样例输出 Copy
3
#include<stdio.h>
int main(){
int n,m;
scanf("%d%d",&n,&m);
int t=1;
while(t*t<n){
t++;
}
int x=t;
t=1;
while(t*t<m){
t++;
}
if(t*t>m){
t--;
}
printf("%d\n",t-x+1);
return 0;
}
B:数列求值
给定一个数列1,1,1,3,5,9,17,...,该数列从第4项开始,每一项都是前三项的和。
2024年11月1日是HNUCM建校90周年纪念日,请求出该数列的第20241101项的最后n位(1<=n<=8)。输入
单组输入。
输入一个正整数n(1<=n<=8)。输出
输出数列第20241101项的最后n位,需要输出前导零。
样例输入 Copy
3样例输出 Copy
069
#include<stdio.h>
int main(){
int m,k=1;
scanf("%d",&m);
for(int i=1;i<=m;i++){
k*=10;
}
int a=1,b=1,c=1,d;
for(int i=4;i<=20241101;i++){
d=(a+b+c)%k;
a=b;
b=c;
c=d;
}
int t=0;
while(d){
d/=10;
t++;
}
while(t!=m){
printf("0");
t++;
}
printf("%d",c);
return 0;
}
C:杏林风华
题目描述
2024年11月1日,湖南中医药大学迎来建校90周年华诞,学校举行了隆重的庆祝仪式。
1934年,于山河破碎的战火中,在中医废止的争论中,湖南中医药大学的前身湖南国医专科学校创建,誓要捍卫与复兴中医药事业。
现在以1934年11月1日中午12时0分0秒作为起点,按照年-月-日 时:分:秒的格式输入一个1934年11月1日中午12时0分0秒以后的时间,请编写一个程序计算中间一共经历了多少秒?输入
单组输入。
输入一个时间,格式为:YYYY-MM-DD HH:mm:SS,其中YYYY表示年,MM表示月,DD表示日,HH表示时(24小时制,范围为0-23),mm表示分,SS表示秒。输出
输出从1934年11月1日中午12时0分0秒开始到输入的时间之间一共经历了多少秒?
样例输入 Copy
1934-11-02 12:00:00样例输出 Copy
86400
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int mm[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int fun(int y) {
return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}
int fun1(int y, int m) {
if (m == 2 && fun(y)) {
return 29;
}
return mm[m];
}
long long fun2(int y, int m, int d, int h, int mi, int s) {
long long t = 0;
for (int i = 1; i < y; i++) {
t += fun(i) ? 366 : 365;
}
for (int i = 1; i < m; i++) {
t += fun1(y, i);
}
t += d - 1;
long long ss = t * 86400LL;
ss += h * 3600LL;
ss += mi * 60LL;
ss += s;
return ss;
}
void solve() {
int y,m,d,h,mi,ss;
scanf("%d-%d-%d %d:%d:%d",&y,&m,&d,&h,&mi,&ss);
long long s1 = fun2(1934, 11, 1, 12, 0, 0);
long long s2 = fun2(y, m, d, h, mi, ss);
printf("%lld\n", s2 - s1);
}
int main() {
solve();
return 0;
}
D:HNUCM的数字测试
HNUCM举行了一场数字测试,fl_shy对数字比较感兴趣,于是参加了这场测试。
在这场数字测试中有一个问题难倒了fl_shy,这个问题叫立方素数,fl_shy知道立方数,比如8 = 2 * 2 * 2,fl_shy也知道素数比如2、3、5、7,但是他就是不知道立方素数。
测试结束后,fl_shy去上网搜索才了解到,立方素数的定义:
如果一个正整数n,是某个数的立方,即n=m∗m∗m,并且它本身的数位之和是素数或者这某个数是素数的话,这个数就称为立方素数。
例如2197就是一个立方素数,2197=13∗13∗13,13是素数并且2+1+9+7=19,19也是素数。
于是fl_shy恍然大悟知道那个问题是一个简单题,不由后悔没有多了解一些知识,但是他希望你们不再犯这个错。
现在他把数字测试这个问题送给你们,希望你们可以解决这个问题让他获得一些慰藉。
这个问题是:
请编写一个程序,求a到b之间存在多少个立方素数(包含a和b)。输入
单组输入。
输入一行,包含两个正整数a和b,两者之间用英文空格隔开,1<=a<b<=10^9。输出
输出a和b之间的立方素数的个数,包含a和b,如果在a和b之间没有立方素数则输出0。
样例输入 Copy
1 100000样例输出 Copy
20
#include<stdio.h>
int prime(int x){
if(x<2){
return 0;
}
for(int i=2;i<=x/i;i++){
if(x%i==0){
return 0;
}
}
return 1;
}
int main(){
int n,m,w,e;
scanf("%d%d",&n,&m);
int t=1;
while(t*t*t<n){
t++;
}
int x=t;
t=1;
while(t*t*t<m){
t++;
}
if(t*t*t>m){
y=cnt-1;
}
else{
y=t;
}
int ss=0;
for(int i=x;i<=y;i++){
int tt=i*i*i;
int s=0;
while(tt){
s+=tt%10;
tt/=10;
}
if(prime(s)||prime(i)) {
ss++;
}
}
printf("%d",ss);
return 0;
}
E:校园乐跑
校园乐跑是每一个大学生必备的。lxb为了能够坚持的乐跑下去,把起点到终点之间分成 n 个区域,共有 1~n 个区域,每个区域自己编号了一个数字 ai ,这个数字代表你能向前走至多 ai 步。
lxb如履薄冰,他从第一个区域出发,你说,他能走到对岸吗?(走到终点)输入
单组输入
第一行输入一个数 n ,代表有 n 个区域。 (n<=1e5)
第二行包含 n 个数,第 i 个数代表你能从 i 区域向前走最多 ai 个区域。(0<= ai <=1e9)输出
输出占一行,
如果能走到区域 n,输出 "YES",否则输出 "NO" ( 输出不包含引号 )样例输入 Copy
5 1 1 1 1 1样例输出 Copy
YES
#include<stdio.h>
int a[100005];
void solve(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
int t=0;
for(int i=n-1;i>=1;i--){
t++;
if(a[i]>=t){
t=0;
}
}
if(t){
printf("NO\n");
}
else{
printf("YES\n");
}
}
int main(){
solve();
return 0;
}
F:画正方形
输入一个正整数 n,要求输出一个n 行 n 列的正方形图案(参考样例输入输出)。图案由大写字母组成。
其中,第 1 行以大写字母 A 开头,第 2 行以大写字母 B 开头,以此类推;在每行中,第 2 列为第 1 列的下一个字母,第 3 列为第 2 列的下一个字母,以此类推;特别的,规定大写字母 Z 的下一个字母为大写字母A。输入
单组输入
输入一行,包含一个正整数 n。约定 2 ≤ n ≤ 40。输出
输出符合要求的正方形图案。
样例输入 Copy
3样例输出 Copy
ABC BCD CDE
#include <stdio.h>
char s[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
void solve() {
int n;
scanf("%d", &n);
int t = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%c", s[(t + j) % 26]);
}
printf("\n");
t++;
}
}
int main() {
solve();
return 0;
}
G:拼接整数
输入N个不同的正整数,从这N个正整数中任意选择两个拼接成一个新的正整数,拼接顺序不同视为两种不同的拼接方法。例如:12和34可以拼接为1234,也可以拼接为3412。
请编写一个程序,统计有多少种拼接方法满足拼出来的正整数是正整数K的倍数。输入
单组输入。
第1行输入一个不超过1000正整数N,表示输入的正整数个数。
第2行输入N个不同的正整数,两两之间用一个英文空格隔开,每个正整数均不超过1000000。
第3行输入一个正整数K,K不超过10000。输出
输出满足拼出来的正整数是K的倍数的拼接方法数。
样例输入 Copy
4 1 2 3 4 3样例输出 Copy
4
#include<stdio.h>
int a[1005];
int main()
{
int n,k,s;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
scanf("%d",&k);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(j==i){
continue;
}
long long t=1,tt=a[j];
while(tt){
tt/=10;
t*=10;
}
if((t*a[i]+a[j])%k==0) {
s++;
}
}
}
printf("%d\n",s);
return 0;
}
H:带分数
100可以表示为带分数的形式,如100 = 3+ 69258/714,还可以表示为100 = 82 + 3546/197。
注意,在上述带分数的形式中,数字1,2,3,4,5,6,7,8,9均出现一次并只能出现一次。
类似这种带分数形式,100一共有11种表示方法。输入
单组输入。
输入一个不超过10000的正整数N。输出
输出该数字用1-9九个数字不重复且不遗漏地组成带分数形式表示的全部方法的数量。
样例输入 Copy
100样例输出 Copy
11
#include <stdio.h>
#include <string.h>
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int fun(int l, int r) {
int s = 0;
for (int i = l; i <= r; i++) {
s = s * 10 + a[i];
}
return s;
}
void swap(int *x, int *y) {
int temp = *x;
*x = *y;
*y = temp;
}
int next_permutation(int *arr, int n){
int i = n - 2;
while (i >= 0 && arr[i] >= arr[i + 1]) i--;
if (i < 0) return 0;
int j = n - 1;
while (arr[j] <= arr[i]) j--;
swap(&arr[i], &arr[j]);
int left = i + 1, right = n - 1;
while (left < right) {
swap(&arr[left], &arr[right]);
left++;
right--;
}
return 1;
}
void solve() {
int n;
scanf("%d", &n);
int s = 0;
do {
for (int i = 0; i < 6; i++) {
for (int j = i + 1; j <= 7; j++) {
int x = fun(0, i);
int y = fun(i + 1, j);
int z = fun(j + 1, 8);
if (y % z == 0 && x + y / z == n) {
s++;
}
}
}
} while (next_permutation(a, 9));
printf("%d\n", s);
}
int main() {
solve();
return 0;
}
I:划龙舟
端午假期到了,hy特意去看划龙舟,在看的过程中,他想到一个问题,现在有一艘船最多载重为limit,还有n个人,第i个人重wi,可以提供的动力为fi,船在在水上移动受到的阻力系数为k,也就是船受到的阻力为k/10*(船上所有人的重量+船的重量),问使得船的动力最多是多少(船的动力=max(船上人提供的动力-船受到的阻力,0)?
输入
第一行输入船的最多载重limit与船的重量W(1<=limit,W<=1000)。
第二行输入两个整数n表示人数和阻力系数k(1<=n<=1000,1<=k<=10)
接下来3到n+2行,每行2个数,依次表示可提供的每个人的动力f和重量w(1<=f,w<=1000)输出
输出最大的动力,四舍五入取整数部分。
样例输入 Copy
10 1 5 2 3 1 5 5 2 6 8 2 1 1样例输出 Copy
15提示
选取第1,2,4,5个人,提供的动力和为17,总重量为9,船重量为1,船的动力为17-10*2/10=15
#include<stdio.h>
int a[1005],b[1005];
int dp[1005];
int ma;
int max(int x,int y){
return x>y?x:y;
}
int main(){
int v,w;
scanf("%d%d",&v,&w);
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d%d",&b[i],&a[i]);
}
for(int i=1;i<=n;i++){
for(int j=v;j>=a[i];j--){
dp[j]=max(dp[j-a[i]]+b[i]*10,dp[j]);
}
}
int m=0;
for(int i=1;i<=v;i++){
m=max(m,dp[i]-i*k-w*k);
}
printf("%d\n",m/10+(m%10>=5));
return 0;
}
J:Count
给定两个正整数n和x,求满足ab + ac + bc ≤ n, a + b + c ≤ x的三元组(a,b,c)的个数。
(1,1,2)和(1,2,1)看做是两个不同的三元组。且a,b,c均为正整数。
输入
1 ≤ n, x ≤ 10^6
输出
输出一个数,表示满足条件的三元组的个数。
样例输入 Copy
7 4样例输出 Copy
4
#include<stdio.h>
#include<string.h>
#define ll long long
void solve(){
ll n,x;
scanf("%lld%lld",&n,&x);
ll ans=0;
for(ll a=1;a*a*3<=n&&a*3<=x;a++){
for(ll b=a;a*b*3<=n&&a+b*2<=x;b++){
for(ll c=b;a*b+a*c+b*c<=n&&a+b+c<=x;c++){
if(a!=b&&b!=c){
ans+=6;
}
else if(a==b&&b==c){
ans++;
}
else{
ans+=3;
}
}
}
}
printf("%lld\n",ans);
}
int main(){
solve();
return 0;
}
K:01 串删除
小明拿到了一个 01 串,他可以进行以下两种操作:
- 删除第一个字符。
- 删除第二个字符。
操作若干次后(可以操作 0 次),将得到一个最终的字符串。该字符串每个'1'字符将增加 1 分,每个'0'字符将减少 1 分。小明希望最终的分数尽可能大,你能帮小明求出这个分数吗?输入
单组输入。
一行字符串,仅由'0'和'1'组成。长度不超过10^5。输出
一个整数,代表最终分数的最大值。
样例输入 Copy
100010001样例输出 Copy
2
#include<stdio.h>
#include<string.h>
char a[100005];
void solve(){
int s=0;
scanf("%s",a);
int n=strlen(a);
for(int i=0;i<n;i++){
if(a[i]=='1'){
s++;
}
else if(s>1){
s--;
}
}
printf("%d\n",s);
}
int main(){
solve();
return 0;
}
L:简单组合
HNUCM某班级一共有n(n<=40)位同学,现在要选m(1<=m<=n)位同学担任学校90周年校庆活动的志愿者,请问一共有多少种不同的选择方案?
输入
单组输入。
输入两个正整数n和m,满足n<=40且1<=m<=n,二者之间用一个英文空格隔开。输出
输出不同选择方案的个数。
样例输入 Copy
5 2样例输出 Copy
10
#include<stdio.h>
#define ll long long
ll C(ll n,ll m){
ll ans = 1;
for(ll i =1;i<=m;i++){
ans = ans * (n-m+i)/i;
}
return ans;
}
int main(){
ll n,m;
scanf("%lld%lld",&n,&m);
printf("%lld\n",C(n,m));
return 0;
}
M:X星搬砖
X星人找到了一个搬砖的工作,他需要徒手把N块砖从仓库搬到工地。
他每次最多可以搬四块砖,当然每次最少也得搬一块。
请问将N块砖从仓库搬到工地,一共有多少种不同的搬运方式?
例如当N=3时有4种不同的搬运方式,分别是:一趟搬运3块;或第1趟搬运2块,第2趟搬运1块;或第1趟搬运1块,第2趟搬运2块;或每趟搬运1块,一共搬运3趟。
请编写一个程序,统计搬运方式的数量?输入
单组输入。
输入一个正整数N,N<=20。输出
输出不同搬运方式的数量。
样例输入 Copy
4样例输出 Copy
8
#include<stdio.h>
int a[25];
int main(){
int n;
scanf("%d",&n);
a[0]=1;
a[1]=1;
a[2]=2;
a[3]=4;
a[4]=8;
for(int i=5;i<=20;i++){
a[i]=a[i-1]+a[i-2]+a[i-3]+a[i-4];
}
printf("%d\n",a[n]);
return 0;
}

1207






