目录
2的N次幂
升级版斐波那契数列
个数统计
个数统计2
大斐列
A+B problem
编辑
A-B problem
快速幂
进行一个幂的运算
整数大小比较
2的N次幂
难度:黄金
0时间限制:1秒
巴占用内存:128M
任意给定一个正整数N(N≤100),计算2的N次方的值。
格式
输入格式:输入一个正整数N。
输出格式:输出2的N次方的值。
//
// Created by abner on 2023/8/30.
//
#include <bits/stdc++.h>
const int LEN = 1e2;
int a[LEN]={1},b[LEN]={2},c[LEN],n;
void clear(int a[]){
for(int i=0;i<LEN;i++)
a[i]=0;
}
void read(int a[]){
char s[LEN];
scanf("%s",s);
clear(a);
int len = strlen(s);
for (int i=0;i<len;i++)
a[len-i-1]=s[i]-'0';
}
void print(int a[]) {
int i;
for (i = LEN - 1; i >= 1; i--)
if (a[i] != 0)
break;
for (; i >= 0; i--)
putchar(a[i] + '0');
putchar('\n');
}
void add(int a[],int b[],int c[]) {//a+b=c
clear(c);
for (int i = 0; i < LEN - 1; i++) {
c[i] += a[i] + b[i];
if (c[i] >= 10) {
c[i + 1] += 1;
c[i] -= 10;
}
}
}
void mul(int a[],int b[],int c[]){//a*b=c
clear(c);
for (int i=0;i<LEN - 1;i++){
for (int j=0;j<=i;j++)
c[i]+=a[j]*b[i-j];
if(c[i]>=10) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
}
int main(){
scanf("%d",&n);
while (n--){
mul(a,b,c);
memcpy(a,c,sizeof(c));
}
print(c);
return 0;
}
升级版斐波那契数列
难度:黄金0时间限制:1秒
巴占用内存:128M
我们都知道斐波那契数列一项是前两项的和,现在我们规定一个升级版斐波那契数列,
一项为前三项的和,要求前n项的和。
即:定义F[1]=1,F[2]=1,F[3]=1,递推关系为F[N]=F[N-1]+F[N-2]+F[N-3]
格式
输入格式:第一行包含一个数n。
输出格式:前n项的和。
//
// Created by abner on 2023/8/30.
//
#include <bits/stdc++.h>
const int LEN = 1e4;
int a[LEN]={1},b[LEN]={1},c[LEN] = {1},d[LEN],ans[LEN]={3},temp[LEN],n;
void clear(int a[]){
for(int i=0;i<LEN;i++)
a[i]=0;
}
void read(int a[]){
char s[LEN];
scanf("%s",s);
clear(a);
int len = strlen(s);
for (int i=0;i<len;i++)
a[len-i-1]=s[i]-'0';
}
void print(int a[]) {
int i;
for (i = LEN - 1; i >= 1; i--)
if (a[i] != 0)
break;
for (; i >= 0; i--)
putchar(a[i] + '0');
putchar('\n');
}
void add(int a[],int b[],int c[]) {//a+b=c
clear(c);
for (int i = 0; i < LEN - 1; i++) {
c[i] += a[i] + b[i];
if (c[i] >= 10) {
c[i + 1] += 1;
c[i] -= 10;
}
}
}
int main(){
scanf("%d",&n);
for (int i=4;i <=n;i++){
add(a, b, temp);
add(temp,c,d);
memcpy(a,b,sizeof b);
memcpy(b,c,sizeof c);
memcpy(c,d,sizeof d);
memcpy(temp,ans,sizeof ans);
add(temp,d,ans);
}
print(ans);
return 0;
}
个数统计
难度:黄金
0时间限制:1秒
巴占用内存:128M
给你一个非负整数N,请求出他的阶乘N!中某个数a出现的次数m。
例如:N=5,a=1时,5!=120,故m=1。
格式
输入格式:输入一行用空格隔开的两个非负整数,分别代表N和α。
输出格式:输出一行一个正整数代表m。
// // Created by abner on 2023/8/30. // #include <bits/stdc++.h> const int LEN = 1e4; int a[LEN]{1},b[LEN]{1},n,a2,ans; void clear(int a[]){ for(int i=0;i<LEN;i++) a[i]=0; } void read(int a[]){ char s[LEN]; scanf("%s",s); clear(a); int len = strlen(s); for (int i=0;i<len;i++) a[len-i-1]=s[i]-'0'; } void print(int a[]) { int i; for (i = LEN - 1; i >= 1; i--) if (a[i] != 0) break; for (; i >= 0; i--) putchar(a[i] + '0'); putchar('\n'); } void add(int a[],int b[],int c[]) {//a+b=c clear(c); for (int i = 0; i < LEN - 1; i++) { c[i] += a[i] + b[i]; if (c[i] >= 10) { c[i + 1] += 1; c[i] -= 10; } } } void mul(int a[],int b[],int c[]){//a*b=c clear(c); for (int i=0;i<LEN - 1;i++){ for (int j=0;j<=i;j++) c[i]+=a[j]*b[i-j]; if(c[i]>=10) { c[i + 1] += c[i] / 10; c[i] %= 10; } } } void mul_short(int a[],int b,int c[]) {//a*b=c,高精度*单精度 clear(c); for (int i = 0; i < LEN - 1; ++i) { c[i] += a[i] * b; if (c[i] >= 10) { c[i + 1] += c[i] / 10; c[i] %= 10; } } } int main(){ scanf("%d%d",&n,&a2); for (int i=2;i<=n;i++){ mul_short(a,i,b); memcpy(a,b,sizeof(b)); } int tag; for (tag = LEN -1;tag >= 1;tag--) if (b[tag]!=0) break; for (;tag >=0;tag--) if (b[tag]==a2) ans++; printf("%d",ans); return 0; }
个数统计2
难度:黄金
0时间限制:1秒
巴占用内存:128M
给你一个非负整数N,请求出它的阶乘N!中某个数b出现的次数m。
注意,判断时,不关注数字出现在哪一位,只关注数字是否一致。
例如:N=5,b=12时,5!=120,故m=1。
格式
输入格式:输入一行用空格隔开的两个非负整数,分别代表N和b
输出格式:输出一行一个正整数代表m。
//
// Created by abner on 2023/8/30.
//
#include <bits/stdc++.h>
const int LEN = 1e4;
int a[LEN]{1},b[LEN]{1},n,a2,ans;
char s[LEN];
void clear(int a[]){
for(int i=0;i<LEN;i++)
a[i]=0;
}
void read(int a[]){
char s[LEN];
scanf("%s",s);
clear(a);
int len = strlen(s);
for (int i=0;i<len;i++)
a[len-i-1]=s[i]-'0';
}
void print(int a[]) {
int i;
for (i = LEN - 1; i >= 1; i--)
if (a[i] != 0)
break;
for (; i >= 0; i--)
putchar(a[i] + '0');
putchar('\n');
}
void add(int a[],int b[],int c[]) {//a+b=c
clear(c);
for (int i = 0; i < LEN - 1; i++) {
c[i] += a[i] + b[i];
if (c[i] >= 10) {
c[i + 1] += 1;
c[i] -= 10;
}
}
}
void mul(int a[],int b[],int c[]){//a*b=c
clear(c);
for (int i=0;i<LEN - 1;i++){
for (int j=0;j<=i;j++)
c[i]+=a[j]*b[i-j];
if(c[i]>=10) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
}
void mul_short(int a[],int b,int c[]) {//a*b=c,高精度*单精度
clear(c);
for (int i = 0; i < LEN - 1; ++i) {
c[i] += a[i] * b;
if (c[i] >= 10) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
}
bool find(int x){
int len(strlen(s));
if (x < len -1)
return false;
for (int i=x,j=0;j<len;j++,i--){
if(b[i]!=s[j]-'0')
return false;
}
return true;
}
int main(){
scanf("%d%s", &n, s);
for (int i=2;i<=n;i++){
mul_short(a,i,b);
memcpy(a,b,sizeof(b));
}
int tag;
for (tag = LEN -1;tag >= 1;tag--)
if (b[tag]!=0)
break;
for (;tag >=0;tag--)
if (find(tag))
ans++;
printf("%d",ans);
return 0;
}
大斐列
难度:黄金
时间限制:1秒
巴占用内存:128M
计算斐波那契数列第n项。
斐波那契数列:1、1、2、3、5、8、13、21、34、
定义F[1]=1,F[2]=1,递推关系为F[N]=F[N-1]+F[N-2]
格式
输入格式:一个整数n。
输出格式:一个整数F[nl。
//
// Created by abner on 2023/8/30.
//
#include <bits/stdc++.h>
using namespace std;
const int LEN = 1e4;
int a[LEN]{1},b[LEN]{1},c[LEN],n;
void clear(int a[]){
for(int i=0;i<LEN;i++)
a[i]=0;
}
void read(int a[]){
char s[LEN];
scanf("%s",s);
clear(a);
int len = strlen(s);
for (int i=0;i<len;i++)
a[len-i-1]=s[i]-'0';
}
void print(int a[]) {
int i;
for (i = LEN - 1; i >= 1; i--)
if (a[i] != 0)
break;
for (; i >= 0; i--)
putchar(a[i] + '0');
putchar('\n');
}
void add(int a[],int b[],int c[]) {//a+b=c
clear(c);
for (int i = 0; i < LEN - 1; i++) {
c[i] += a[i] + b[i];
if (c[i] >= 10) {
c[i + 1] += 1;
c[i] -= 10;
}
}
}
void mul(int a[],int b[],int c[]){//a*b=c
clear(c);
for (int i=0;i<LEN - 1;i++){
for (int j=0;j<=i;j++)
c[i]+=a[j]*b[i-j];
if(c[i]>=10) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
}
void mul_short(int a[],int b,int c[]) {//a*b=c,高精度*单精度
clear(c);
for (int i = 0; i < LEN - 1; ++i) {
c[i] += a[i] * b;
if (c[i] >= 10) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
}
//bool find(int x){
// int len(strlen(s));
// if (x < len -1)
// return false;
// for (int i=x,j=0;j<len;j++,i--){
// if(b[i]!=s[j]-'0')
// return false;
// }
// return true;
//}
int main(){
scanf("%d",&n);
for (int i=3;i<=n;i++){
add(a,b,c);
memcpy(a,b,sizeof b);
memcpy(b,c,sizeof c);
}
print(c);
return 0;
}
A+B problem
难度:黄金
0时间限制:1秒
巴占用内存:128M
计算A+B(1≤A,B≤1010000)。
格式
输入格式:两行每行一个整数A,B。
输出格式:一个整数A+B。
样例1
输入:1
1
输出:2
//
// Created by abner on 2023/8/30.
//
#include <bits/stdc++.h>
const int LEN = 10e4+7;
int a[LEN],b[LEN],c[LEN],n,a2,ans;
char s[LEN];
void clear(int a[]){
for(int i=0;i<LEN;i++)
a[i]=0;
}
void read(int a[]){
char s[LEN];
scanf("%s",s);
clear(a);
int len = strlen(s);
for (int i=0;i<len;i++)
a[len-i-1]=s[i]-'0';
}
void print(int a[]) {
int i;
for (i = LEN - 1; i >= 1; i--)
if (a[i] != 0)
break;
for (; i >= 0; i--)
putchar(a[i] + '0');
putchar('\n');
}
void add(int a[],int b[],int c[]) {//a+b=c
clear(c);
for (int i = 0; i < LEN - 1; i++) {
c[i] += a[i] + b[i];
if (c[i] >= 10) {
c[i + 1] += 1;
c[i] -= 10;
}
}
}
void mul(int a[],int b[],int c[]){//a*b=c
clear(c);
for (int i=0;i<LEN - 1;i++){
for (int j=0;j<=i;j++)
c[i]+=a[j]*b[i-j];
if(c[i]>=10) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
}
void mul_short(int a[],int b,int c[]) {//a*b=c,高精度*单精度
clear(c);
for (int i = 0; i < LEN - 1; ++i) {
c[i] += a[i] * b;
if (c[i] >= 10) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
}
bool find(int x){
int len(strlen(s));
if (x < len -1)
return false;
for (int i=x,j=0;j<len;j++,i--){
if(b[i]!=s[j]-'0')
return false;
}
return true;
}
int main() {
read(a);
read(b);
add(a, b, c);
print(c);
return 0;
}
A-B problem
难度:黄金
0时间限制:1秒
巴占用内存:128M
计算A-B(1≤B≤A≤1010000)。
格式
输入格式:两行每行一个整数A,B。
输出格式:一个整数A一B。
样例1
输入:2
1
// // Created by abner on 2023/8/30. // #include <bits/stdc++.h> const int LEN = 10e4+7; int a[LEN],b[LEN],c[LEN],n,a2,ans; char s[LEN]; void clear(int a[]){ for(int i=0;i<LEN;i++) a[i]=0; } void read(int a[]){ char s[LEN]; scanf("%s",s); clear(a); int len = strlen(s); for (int i=0;i<len;i++) a[len-i-1]=s[i]-'0'; } void print(int a[]) { int i; for (i = LEN - 1; i >= 1; i--) if (a[i] != 0) break; for (; i >= 0; i--) putchar(a[i] + '0'); putchar('\n'); } void add(int a[],int b[],int c[]) {//a+b=c clear(c); for (int i = 0; i < LEN - 1; i++) { c[i] += a[i] + b[i]; if (c[i] >= 10) { c[i + 1] += 1; c[i] -= 10; } } } void mul(int a[],int b[],int c[]){//a*b=c clear(c); for (int i=0;i<LEN - 1;i++){ for (int j=0;j<=i;j++) c[i]+=a[j]*b[i-j]; if(c[i]>=10) { c[i + 1] += c[i] / 10; c[i] %= 10; } } } void mul_short(int a[],int b,int c[]) {//a*b=c,高精度*单精度 clear(c); for (int i = 0; i < LEN - 1; ++i) { c[i] += a[i] * b; if (c[i] >= 10) { c[i + 1] += c[i] / 10; c[i] %= 10; } } } bool find(int x){ int len(strlen(s)); if (x < len -1) return false; for (int i=x,j=0;j<len;j++,i--){ if(b[i]!=s[j]-'0') return false; } return true; } void sub(int a[],int b[],int c[]){ clear(c); for (int i=0;i<LEN - 1;i++){ c[i]+=a[i]-b[i]; if(c[i]<0){ c[i+1]-=1; c[i]+=10; } } } int main() { read(a); read(b); sub(a, b, c); print(c); return 0; }
快速幂
难度:黄金
0时间限制:1秒
巴占用内存:128M
给你三个整数a,b,c,让你求出a5 mod c。
格式
输入格式:三个用空格隔开的整数a,b和c。
输出格式:一个整数,表示a5 mod c的值。
样例1
输入:239
输出:8
//
// Created by abner on 2023/8/30.
//
#include <bits/stdc++.h>
using namespace std;
int a,b,c;
long long binpow(long long a,long long b,long long m){
a%=m;
long long res = 1;
while (b > 0){
if (b &1)
res =res * a%m;
a=a*a%m;
b>>=1;
}
return res;
}
int main(){
cin >>a >>b >>c;
cout <<binpow(a,b,c);
return 0;
}
进行一个幂的运算
难度:黄金
©时间限制:1秒
巴占用内存:128M
让我们来简单练习一下求幂。
给出m和k,求m的2k-1次幂。答案对100000007取模。
格式
输入格式:两个整数m,k,,意义如题所示。
输出格式:一个整数表示答案。
//
// Created by abner on 2023/8/30.
//
#include <bits/stdc++.h>
using namespace std;
const int mod = 100000007;
int m,k;
long long binpow(long long a,long long b,long long m){
a %= m;
long long res = 1;
while (b > 0){
res = res * a % m;
a=a * a % m;
b--;
}
return res;
}
int main(){
cin >>m >>k;
cout << binpow(m,k,mod);
return 0;
}
整数大小比较
难度:黄金
0时间限制:1秒
巴占用内存:128M
给出两个正整数,判断他们的大小。
格式
输入格式:两个正整数。
输出格式:若前者大,输出>,
若后者大,输出
若一样大,输出=。
样例1
输入:141289461924461989123762842222
//
// Created by abner on 2023/8/30.
//
#include <bits/stdc++.h>
using namespace std;
int main(){
string s1,s2;
cin >>s1 >>s2;
if (s1.length()>s2.length())
cout <<">"<<endl;
else if (s1.length()<s2.length())
cout <<"<"<<endl;
else{
if(s1>s2)
cout <<">"<<endl;
else if (s1 < s2)
cout <<"<"<<endl;
else
cout <<"="<<endl;
}
return 0;
}