中南大学第七届大学生程序设计竞赛

Balls and Boxes

拓展欧几里德的应用,比赛时看到题目就想到拓展欧几里德了,不过由于少了一个判断条件Wrong了,而且中南的oj还不能用I64输出。

赛后看了题解,加了个条件,一开始很天真的用while循环累加,果断超时,没办法了,只能精确推出倍数,结果又Wrong了。

经过n次试验,无节操的提交终于找到问题的根源了,由于推出来的公式次数是负的,调用Exgcd的时候直接带入的-n,导致求出来的(m,n)<0,结果累加量也小于零。

总的来说,题目不难,但是需要注意的细节比较多,谨记谨记!


Happy Number

第一次写数位DP,之前看了一篇国家队的论文,写起来很顺手,做之前题目的时候发现不能用I64输出,做这个题目在Wrong了十次左右之后发现输入也不能用I64d。


Balls and Boxes ACcode:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long LL;

int Exgcd(int a, int b, LL &x, LL &y)
{
    if (b == 0)
    {
        x = 1,y = 0;
        return a;
    }
    int r = Exgcd(b, a % b, x, y);
    LL t = x;
    x = y;
    y = t - a / b * y;
    return r;
}

int Max(int a1,int a2)
{
    return a1>a2?a1:a2;
}

int Min(int a1,int a2)
{
    return a1<a2?a1:a2;
}

int main()
{
    int m,n,s,T,d,up,down;
    LL ans,x,y,a,b,t,cnt;
    scanf("%d",&T);
    while (T--)
    {
        cnt=s=0,up=-1,down=10000007;
        scanf("%d%d",&m,&n);
        for (int i=0;i<m;i++)
        {
            scanf("%d",&d);
            up=Max(up,d);
            down=Min(down,d);
            s+=d;
        }
        d=Exgcd(m,n,y,x);
        if (down==up) ans=0;
        else if (s%d) ans=-1;
        else
        {
           x*=-s/d,y*=s/d;
           a=m/d,b=n/d;
           if (y>=up) t=(y-up)/b;
           else t=(y-up+1)/b-1;
           y-=t*b,x-=t*a;
           if ((y-x)>down)
           {
               t=(y-x-down-1)/(a-b)+1;
               x+=t*a,y+=t*b;
           }
           ans=x;
        }
        printf("%lld\n",ans);
    }
    return 0;
}


Happy Number ACcode:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long LL;

LL a,b,res;
int up[20];
int y[1600],vis[1600];
LL f[20][1600],dp[1600];

int pow2(LL x)
{
    int s=0,t;
    while (x>0)
    {
        t=x%10;
        s+=t*t;
        x/=10;
    }
    return s;
}

void prepare()
{
    int t,k,s;
    int x[]={1,7,10,13,19,23,28,31,32,44,49};
    up[1]=81;
    memset(f,0,sizeof(f));
    memset(vis,0,sizeof(vis));
    for (int i=0;i<=10;i++) vis[x[i]]=1;
    for (int i=50;i<1600;i++)
    {
        k=i;
        while (k>=i) k=pow2(k);
        vis[i]=vis[k];
    }
    for (int i=0;i<10;i++)
    f[1][i*i]=1;
    for (int i=2;i<19;i++)
    {
        for (int j=0;j<10;j++)
        {
            t=j*j;
            for (int k=up[i-1];k>=0;k--)
            f[i][k+t]+=f[i-1][k];
        }
        up[i]=up[i-1]+81;
    }
}

void dfs(int pre,LL num)
{
    if (num<10)
    {
        for (int j=0;j<=num;j++)
        {
            int t=pre+j*j;
            if (vis[t]) dp[t]++;
        }
        return ;
    }
    int d=0,p;
    LL t=num,r=1,c=0;
    while (t>9)
    {
        d++;
        c+=(t%10)*r;
        r*=10;
        t/=10;
    }
    for (int i=0;i<t;i++)
    {
        p=pre+i*i;
        for (int j=up[d];j>=0;j--)
        dp[j+p]+=f[d][j];
    }
    pre+=t*t;
    dfs(pre,c);
}

LL solve(LL num)
{
    memset(dp,0,sizeof(dp));
    dfs(0,num);
    LL sum=0;
    for (int i=1;i<1500;i++)
        if (vis[i]) sum+=dp[i];
    return sum;
}

int main()
{
    prepare();
    int T;
    scanf("%d",&T);
    while (T--)
    {
        scanf("%lld%lld",&a,&b);
        LL res=solve(b);
        res-=solve(a-1);
        if (res<0) res=-1;
        printf("%lld\n",res);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
从键盘输入矩阵 从文本文件中输入矩阵(需要手动输入行列数) 矩阵相乘 求信息矩阵 求各精矿及尾矿的理论产率 习题第一题: 某选矿车间某班取样化验数据如表1,利用矿量平衡和金属平衡可以列出含四个方程的线性方程组,请利用行线性变换编程求出各精矿及尾矿的理论产率 求多项式回归的相关矩阵和模型参数,回归模型相对误差等 相对误差r3>0.1,在允许相对误差为0.1的情况下认为模型不合理 习题第六题 2 因变量y是自变量x的非线性函数,已得到实测数据见表2,假定y可以用x的3 次多项式近似表示,即y对x的多项式回归模型为 y=b0+b1x+b2x2+b3x3 请求出模型蚕数b0、b1、b2和b3,计算模型值ym与相对误差r%并填入表2中。 功能七:求方程组的解和系数矩阵的逆矩阵 习题第三题: 请用行线性变换求下面三元一次线性方程组的解和系数矩阵的逆矩阵。 功能8,求矛盾线性方程组的相关矩阵和解(最小二乘法) 习题第四题 在表1中增加两种组分的化验品位如表2,可以列出六个线性方程,显然是矛盾的方程 组,请用最小二乘法求精/尾矿产率的最小二乘解,并填入表2相应位置。 求多元线性回归模型的相关矩阵和模型参数 习题第五题: 对6个红薯品种的研究测定了比叶重、气孔密度、叶绿素含量和光合速率如表3,假定光合速率对比叶重、气孔密度、叶绿素含量有线性相关关系,即回归模型可以表示为 y=b0+b1*x1+b2*x2+b3*x3 求回归模型参数,并计算出模型值和相对误差填入表3中。 习题6和习题7 6. 矩阵类的load函数要求输入文本数据文件中数据的行列数,而从文本数据文件 无法直接判断数据文件中数据的行列数,除非先用其它方式打开来看才知道,很不方便。请修改load函数,使load函数能自动探测文本数据文件中数据的行列数,省去人工输入行列数。 7矩阵类中添加保存数据为文本数据文件的save()成员函数及相应菜单功能,保存数据前要输入文件名, 注意保存的格式要使原有的load函数能正确读取。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值