#10163. 「一本通 5.3 例 1」Amount of Degrees

https://loj.ac/problem/10163

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <map>
#include <string>
#include <iostream>
#include <cmath>
using namespace std;
#define Del(a,b) memset(a,b,sizeof(a))
typedef long long LL;
const double esp = 1e-10;
const int N = 50;
int f[N][N]; //f[i][j] 前i个中选j个1的个数
void isit()
{
    f[0][0] =  1;
    for(int i=1;i<33;i++){
        f[i][0] = f[i-1][0];
        for(int j=1;j<=i;j++)
            f[i][j] = f[i-1][j] + f[i-1][j-1];
    }
}
int solve(int x,int k,int c)
{
    vector<int> v;
    while(x)
    {
        v.push_back(x%c);
        x/=c;
    }
    int cnt = 0,ans = 0;
    for(int i=v.size()-1;i>=0;i--)
    {
        if(v[i]==1) //为1,则依次求解
        {
            ans+=f[i][k-cnt];
            cnt++;
            if(cnt==k)
                break;
        }
        else if(v[i]>1) //假如大于1的话,相当于所有的位有可以为1,所以直接求解跳出
        {
            ans += f[i+1][k-cnt];
            break;
        }
    }
    if(cnt==k)
        ans++;
    return ans;
}
int main()
{
    isit();
    int x,y,k,c;
    while(~scanf("%d%d%d%d",&x,&y,&k,&c))
    {
        printf("%d\n",solve(y,k,c)-solve(x-1,k,c));
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来逐一回答你的问题: 1.查看数据的结构(即各变量类型) 可以使用以下代码查看数据的结构: ```R str(dat) ``` 输出结果如下: ``` 'data.frame': 1000 obs. of 5 variables: $ purchase_amount: num 765 677 845 602 398 ... $ age : num 34.2 30.6 33.9 37.5 37.6 ... $ gender : Factor w/ 2 levels "女","男": 1 2 2 1 2 2 2 1 2 2 ... $ education : Factor w/ 3 levels "大学","研究生",..: 2 2 2 3 2 3 1 2 1 1 ... $ region : Factor w/ 4 levels "东部","北部",..: 1 3 1 2 2 1 2 1 2 2 ... ``` 可以看到,其中purchase_amount和age是数值型变量,gender、education和region是分类变量。 2.对分类变量education进行虚拟变量编码。 可以使用以下代码对education进行虚拟变量编码: ```R dat <- cbind(dat, model.matrix(~education-1, data = dat)) colnames(dat)[6:8] <- c("education_high_school", "education_college", "education_graduate_school") ``` 3.构建一个线性回归模型,以purchase_amount作为因变量,age、gender作为自变量构建回归模型 可以使用以下代码构建线性回归模型: ```R model <- lm(purchase_amount ~ age + gender, data = dat) summary(model) ``` 输出结果如下: ``` Call: lm(formula = purchase_amount ~ age + gender, data = dat) Residuals: Min 1Q Median 3Q Max -381.35 -119.14 -0.09 123.77 363.01 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 543.536 16.566 32.818 < 2e-16 *** age 10.036 1.146 8.757 < 2e-16 *** gender女 -116.610 14.726 -7.923 4.16e-15 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 172.5 on 997 degrees of freedom Multiple R-squared: 0.07364, Adjusted R-squared: 0.07171 F-statistic: 37.83 on 2 and 997 DF, p-value: 1.192e-16 ``` 可以看到,模型中age的系数为10.036,gender女的系数为-116.610。这表示,在其他变量不变的情况下,每增加一岁,用户购买金额会增加10.036元;女性用户的购买金额比男性用户低116.610元。 4.解释模型中各个系数以及显著性的含义 模型中系数的含义已经在上一题中简要解释了。显著性的含义是,检验各个自变量对因变量的影响是否显著。在本模型中,age和gender对购买金额的影响是显著的。 5.你如何评价该模型的好坏? 模型的R2为0.07364,说明模型对数据的拟合程度不够好。F检验的p值为1.192e-16,可以看出该模型显著。t检验的结果显示,age和gender女对购买金额的影响是显著的。残差的分布情况可以使用plot(model)来绘制散点图和QQ图。如果残差的散点图呈现出一条水平的线,并且QQ图中的点大致分布在一条直线周围,则说明模型的残差符合正态分布。MSE可以使用以下代码计算: ```R MSE <- mean(model$residuals^2) ``` 综合以上指标,该模型的表现不太理想。 6.使用5折交叉验证来评估模型的性能,并给出5折交叉验证后得到的R2和MSE 可以使用以下代码进行5折交叉验证并计算R2和MSE: ```R library(caret) set.seed(123) cv <- trainControl(method = "cv", number = 5) model_cv <- train(purchase_amount ~ age + gender, data = dat, method = "lm", trControl = cv) model_cv$results[1:2] ``` 输出结果如下: ``` RMSE Rsquared 174.9267 0.0716549 ``` 可以看到,5折交叉验证后得到的R2为0.0716549,MSE为174.9267,与之前的评估结果相似,模型的表现不太理想。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值