logo AlgoBeat OnlineJudge
登录 注册

「超级数学计划」 题解

作者: Dr_KC_Haus  ·  发布于 2026-06-08 18:38:53  ·  最后修改于 2026-06-08 19:38:22
已通过
审核员:joe_zxq 彩笔 · 2026-06-08 19:38:22

我们分步来解题。

排列与组合

先用一个函数用来求阶乘,这是为了让后面的运算更简便。

int jiecheng(int n) {
    if (n<0) return 0;
    int res=1;
    for (int i=2;i<=n;i++) res*=i;
    return res;
}

然后计算 ,但是要特判

int sum_A(int n,int m) {
    if (n<m||n<0||m<0) return 0;
    return jiecheng(n)/jiecheng(n-m);
}

接着计算 ,还是需要特判:

int sum_C(int n,int m) {
    if(n<m||n<0||m<0) return 0;
    return jiecheng(n)/(jiecheng(m)*jiecheng(n-m));
}

有理数加法

很简单,但是注意题目中所说:

小数输出请不要使用 printf

void rno(int n) {
    while(n--){
        int c;
        cin>>c;
        double sum=0.0;
        for (int j=0;j<c;j++) {
            double num;
            cin>>num;
            sum+=num;
        }
        cout<<fixed<<setprecision(5)<<sum<<endl;
    }
}

进制转换

先定义一个字符串用来存余数。

判断这个数是不是负数,如果是,就让它变成它的相反数,最后在前面输出一个负号就行了。

然后短除:

while(d>0){
        int cnt=d%e;//取余
        res=a[cnt]+res;//添加余数
        d=d/e;//    }

所以代码就是:

string jinzhi(int d,int e){ 
	if(e<2 or e>=36) return "Error";
    if(d==0) return "0";
    string a="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    string res="";
    bool flag=false;
    if(d<0){
        flag=true;
        d=-d;
    }
    while(d>0){
        int cnt=d%e;
        res=a[cnt]+res;
        d=d/e;
    }
    if (flag) res="-"+res;
    return res;
}

有理数乘方

使用快速幂模版就行:

void pon(int n) {
    for(int i=0;i<n;i++) {
        int a,b;
        cin>>a>>b;
        int res=1;
        for(int j=0;j<b;j++) res*=a;
    	cout<<res<<endl;
    }
}

那么完整代码就是:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int T;
int jiecheng(int n) {
    if (n<0) return 0;
    int res=1;
    for (int i=2;i<=n;i++) res*=i;
    return res;
}
int sum_A(int n,int m) {
    if (n<m||n<0||m<0) return 0;
    return jiecheng(n)/jiecheng(n-m);
}
int sum_C(int n,int m) {
    if(n<m||n<0||m<0) return 0;
    return jiecheng(n)/(jiecheng(m)*jiecheng(n-m));
}
string jinzhi(int d,int e){ 
	if(e<2 or e>=36) return "Error";
    if(d==0) return "0";
    string a="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    string res="";
    bool flag=false;
    if(d<0){
        flag=true;
        d=-d;
    }
    while(d>0){
        int cnt=d%e;
        res=a[cnt]+res;
        d=d/e;
    }
    if (flag) res="-"+res;
    return res;
}
void pac() {
    char c;
    cin>>c;
    int n,m;
    cin>>n>>m;
    if(c=='A') cout<<sum_A(n,m)<<endl;
    else if(c=='C') cout<<sum_C(n,m)<<endl;
}
void rno(int n) {
    while(n--){
        int c;
        cin>>c;
        double sum=0.0;
        for (int j=0;j<c;j++) {
            double num;
            cin>>num;
            sum+=num;
        }
        cout<<fixed<<setprecision(5)<<sum<<endl;
    }
}
void dc(int n) {
    for(int i=0;i<n;i++) {
        int d,e;
        cin>>d>>e;
        cout<<jinzhi(d,e)<<endl;
    }
}
void pon(int n) {
    for(int i=0;i<n;i++) {
        int a,b;
        cin>>a>>b;
        int res=1;
        for(int j=0;j<b;j++) res*=a;
    	cout<<res<<endl;
    }
}
signed main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
    cin>>T;
    while(T--){
        string s;
        int cnt;
        cin>>s ;
        if(s=="pac") pac();
        else{
        	cin>>cnt;
            if(s=="rno") rno(cnt);
    	    if(s=="dc") dc(cnt);
            if(s=="pon") pon(cnt);
        } 
    }
    exit(0);
}

暂无评论

登录 后即可评论。