首页 > 其他分享 >iwtgm-12

iwtgm-12

时间:2023-11-03 22:22:51浏览次数:37  
标签:系数 string ll iwtgm 12 && 杨辉三角 now

补G题
一个大模拟
首先p不一定是质数,不能用逆元,用到了杨辉三角处理二次项系数
首先输入就很唬人,看题解学到用标记的方式分隔
系数默认为1,幂默认为1
有两个字符变量相同的情况,把系数合并
系数不为0才输出,系数为1不输出1,非1才有乘号,幂为1不输出
t次方就是杨辉三角的第t行,0-t就是从左到右的二次项系数,第一个变量和系数的幂次是t-i,第二个是i

ll p,t;//模数、幂
string vv[2];//两个字母变量
ll x[2];//两个系数
string s;//输入字符串
ll C[N][N];//杨辉三角得到二次项系数,因为p不一定为质数,所以不能用逆元,用杨辉三角
void init(){
    C[0][0]=1;
    for(int i=1;i<N;i++){
        C[i][0]=1;
        for(int j=1;j<=i;j++){
            C[i][j]=(C[i-1][j]+C[i-1][j-1])%p;
        }
    }
}
ll ksm(ll a,ll b){
    a%=p;
    ll res=1;
    while(b){
        if(b&1)res=res*a%p;
        a=a*a%p;
        b>>=1;
    }
    return res;
}
void solve(){
    cin>>s;
    int zt=0;//标记,用来处理字符串
    x[0]=x[1]=1;//系数默认为1
    t=1;//幂默认为1
    string tmp="";//字母变量
    ll a=0;//字符串->数字用
    for(int i=0;i<s.size();i++){
        if(s[i]=='('){
            zt=1;//此时处理第一个系数
        }else if(s[i]=='+'){
            zt=2;//此时处理第二个系数
        }else if(s[i]==')'){
            zt=3;
        }else if(s[i]=='^'){
            zt=4;//此时处理幂
        }else if(s[i]=='%'){//%一定出现
            if(a){//有幂则更新幂
                t=a;
                a=0;
            }
            zt=5;//处理模数
        }else{
            if(zt==1){
                if(s[i]>='0'&&s[i]<='9'){
                    a=a*10+(s[i]-'0');
                }else{
                    if(a){//a为系数
                        x[0]=a;
                    }
                    a=0;
                    tmp+=s[i];
                    vv[0]=tmp;//第一个字符变量
                    tmp="";
                }
            }else if(zt==2){
                if(s[i]>='0'&&s[i]<='9'){
                    a=a*10+(s[i]-'0');
                }else{
                    if(a){//第二个系数
                        x[1]=a;
                    }
                    a=0;
                    tmp+=s[i];
                    vv[1]=tmp;//第二个字符变量
                    tmp="";
                }
            }else if(zt==4){
                if(s[i]>='0'&&s[i]<='9'){
                    a=a*10+(s[i]-'0');
                }
            }else if(zt==5){
                if(s[i]>='0'&&s[i]<='9'){
                    a=a*10+(s[i]-'0');
                }
            }
        }
    }
    p=a;//得到模数
    init();//杨辉三角
    if(vv[0]==vv[1]){//两个字符变量相同,则把系数合并
        ll xx=(x[0]+x[1])%p;
        vector<ll>v;
        ll now=ksm(xx,t)%p;
        if(now){//系数不为0
            v.push_back(now);
        }
        if(v.size()==0){//系数为0,不输出
            cout<<s<<" = "<<"0";
        }else{
            cout<<s<<" = ";
            if(now!=1)//系数为1,1不输出
                 cout<<now<<"*";
            cout<<vv[0];
            if(t!=1){//幂为1,1不输出
                cout<<"^"<<t;
            }
            cout<<"%"<<p;
        }
        return ;
    }
    vector<pair<ll,pair<int,int>>>v;
    for(ll i=0;i<=t;i++){//t次方就是杨辉三角的第t行,0-t就是从左到右的二次项系数,第一个变量和系数的幂次是t-i,第二个是i
        ll now=C[t][i]*ksm(x[0],t-i)%p*ksm(x[1],i)%p;//二次项系数*变量系数
        if(now!=0){//系数不为0才要输出
            v.push_back({now,{t-i,i}});//存下要输出的系数、幂次
        }
    }
    if(v.size()==0){//系数全为0,不输出
        cout<<s;
        cout<<" = ";
        cout<<"0";
    }else if(v.size()==1){//只有一项,没有括号
        cout<<s;
        cout<<" = ";
        int fg=0;
        if(v[0].first!=1){
            cout<<v[0].first;
            fg=1;//系数不为0
        }
        if(v[0].second.first){
            if(fg==1){//系数不为0,才有乘号
                cout<<"*"<<vv[0];
            }else{
                cout<<vv[0];
            }
            fg=1;
            if(v[0].second.first!=1){//幂次不为1才有"^"
                cout<<"^"<<v[0].second.first;
            }
        }
        if(v[0].second.second){//同理
            if(fg==1){
                cout<<"*"<<vv[1];
            }else{
                cout<<vv[1];
            }
            fg=0;
            if(v[0].second.second!=1){
                cout<<"^"<<v[0].second.second;
            }
        }
        cout<<"%"<<p;
    }else{//多项,有括号
        cout<<s;
        cout<<" = ";
        cout<<"(";
        int tot=0;
        for(auto i:v){
            int fg=0;
            if(i.first!=1) {
                cout << i.first;
                fg=1;
            }
            if(i.second.first){
                if(fg==1){
                    cout<<"*"<<vv[0];
                }
                else{
                    cout<<vv[0];
                }
                fg=1;
                if(i.second.first!=1){
                    cout<<"^"<<i.second.first;
                }
            }
            if(i.second.second){
                if(fg==1){
                    cout<<"*"<<vv[1];
                }
                else{
                    cout<<vv[1];
                }
                fg=0;
                if(i.second.second!=1){
                    cout<<"^"<<i.second.second;
                }
            }
            if(tot!=v.size()-1){
                cout<<"+";
            }
            tot++;
        }
        cout<<")";
        cout<<"%"<<p;
    }
}

标签:系数,string,ll,iwtgm,12,&&,杨辉三角,now
From: https://www.cnblogs.com/wwww-/p/17808421.html

相关文章

  • [ARC122D] XOR Game
    ProblemStatementThereare$2N$integerswrittenonablackboard.The$i$-thintegeris$A_i$.AliceandBobwillplayagameconsistingof$N$rounds.Ineachround,theydothefollowing:First,Alicechoosesanintegerontheblackboardanderasesit.......
  • [ARC122E] Increasing LCMs
    ProblemStatementWehaveasequenceof$N$positiveintegers:$A_1,A_2,\cdots,A_N$.Youaretorearrangetheseintegersintoanothersequence$x_1,x_2,\cdots,x_N$,where$x$mustsatisfythefollowingcondition:Letusdefine$y_i=\operatorname{LCM}(x......
  • Oracle 性能检查SQL 语句 转载 https://blog.csdn.net/wan212000/article/details/13
    目录1.Oracle查询SQL语句1.1.性能查询常用SQL1.1.1.查询最慢的SQL1.1.2.列出使用频率最高的5个查询1.1.3.消耗磁盘读取最多的sqltop51.1.4.找出需要大量缓冲读取(逻辑读)操作的查询1.1.5.查询每天执行慢的SQL1.1.6.从V$SQLAREA中查询最占用资源的查询1.1.7.......
  • Veeam Backup&Replication V12 配置和优化代理服务器
    已经安装并完成了VeeamBackup&Replication所需的基本配置,接下来就可以配置和优化代理服务器:ProxyServers:代理服务器是VeeamBackup&Replicationv12应用程序,它们负责备份和还原作业的所有繁重任务或处理任务。VeeamBackup&Replicationv12引入了将Linux代理与持续数据保护Conti......
  • 文心一言 VS 讯飞星火 VS chatgpt (127)-- 算法导论11.2 2题
    二、用go语言,位向量(bitvector)是一个仅包含0和1的数组。长度为m的位向量所占空间要比包含m个指针的数组少得多。请说明如何用一个位向量来表示一个包含不同元素(无卫星数据)的动态集合。字典操作的运行时间应为O(1)。文心一言,代码正常运行:在Go语言中,我们可以使用map[int]bool......
  • 文心一言 VS 讯飞星火 VS chatgpt (127)-- 算法导论11.2 2题
    二、用go语言,位向量(bitvector)是一个仅包含0和1的数组。长度为m的位向量所占空间要比包含m个指针的数组少得多。请说明如何用一个位向量来表示一个包含不同元素(无卫星数据)的动态集合。字典操作的运行时间应为O(1)。文心一言,代码正常运行:在Go语言中,我们可以使用map[int]bool来......
  • iwtgm-11
    题目链接A.能全买,就让剩余的总钱/全买,加上可得的糖数,总钱-这些花费此时不能全买,就遍历一遍,算出能买的总数再让剩余的总钱/能买的...这样是不会T的:设total为这一轮能买的糖果的总价格,last为之前剩下的钱,now为这一轮买完糖果后剩下的钱now=last%total,所以now<total,(取模肯定......
  • HCIP Datacom H12-831考题解析
    OSPFv3专题6.关于0SPFv3报文,以下哪个描述是正确的?郑锦程校对整理2023.11.03A.OSPFv3的Hello报文携带了路由器所有接口的IPv6地址B.OSPFv3使用链路本地地址作为发送报文的源地址,报文可以被转发到始发链路范围之外C.OSPFv3使用IPv6组播地址FF02:1和FF02:2发送OSPFv3报文D.可以在OSPFv......
  • 12Go语言基础之结构体
    Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。类型别名和自定义类型自定义类型在Go语言中有一些基本的数据类型,如string、整型、浮点型、布尔等数据类型,Go语言中可以使用type关键......
  • Veeam Backup & Replication 12 配置
    安装完后现在可以配置与备份vSphere相关的选项:1.RepositoryServer:用于存储备份文件的服务器。2.ProxyServers代理服务器:执行所有备份任务的服务器。3.VMwarevCenter凭据:此凭据用于连接并查看群集、主机、vApp和虚拟机。不需要vCenterServer,也支持独立ESXi主机。首次启动Veeam......