2024杭电ACM-个人PK赛(1)——合法数对

链目链接:合法数对

在这里插入图片描述

分析:
首先,数据范围非常大,要么就是高精度,要么就是字符串存储
本题输入以二进制的形式给出。
对于没有思路的小伙伴,大家可以打表,找找规律
那这道题,我是用dp做的
x^y=x|y,即二进制对应位,x与y不同时为1

打表如下

十进制值对应答案二进制
131
2710
3911
417100
521101
625110
727111
8431000
9511001
10591010
11631011
12711100
13751101
14791110
15811111
1611310000

对于找规律的people来说:
首先看对于1000(2)和1001(2)来说:
前面三位是相同的,都是100,那么是否可以由100来推出1001?
经过观察不难发现,每次在前一个二进制数字后,多加一个1,对应答案就会×3
每次加上一个0,对应答案就是,设cnt=1000里面0的个数,则答案为100(2)之后放1的答案,减去2cnt次方

从dp角度观察,在1000内,x取值[0,8],y取值[0,8],
1001比1000多了一个1,x取值[0,9],y取值[0,9],
即多了x取9,y取[0,9],y取9,x取[0,9],这么多情况,当然,其中很多种都是无效的,
那么哪些是有效的呢,当x取9的时候,假设1001,对应四个位置,1234,
那么取3、4,这两个位置,都不会形成1的交集,即2²(每个位置都有0、1两种情况,即2*2),
同理,反过来y取9也是同样的,即,1001的对应答案 - 23

代码:

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int N=2e6+10,mod=998244353;
int n,m,f[N][2],cnt;//前i位,以j结尾的答案的个数(当然可以滚动数组优化掉一维啦,本代码直接
string s;			//						  去掉前面一维就可以了,这里两维更好看懂)(ps:指不经过大脑)
int qmi(int a,int b)//快速幂
{
    int res=1;
    while(b)
    {
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
signed main()
{
    ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);//快输
    cin>>s;
    n=s.size();
    f[0][1]=3;//特殊定义前1位以1结尾答案为3,字符串下标从0~n-1,所以这里是0
    for(int i=1;i<n;i++)
    {			  
        f[i][1]=f[i-1][s[i-1]-'0']*3%mod;//前i位以1结尾,等于前i-1位以s[i-1]结尾的答案×3
        if(s[i]=='0') cnt++,f[i][0]=(f[i][1]-qmi(2,cnt)+mod)%mod;
    }			   // 记录0的个数,前i位以0结尾,等于前i位以1结尾的答案减去2的cnt次方,		
    cout<<f[n-1][s[n-1]-'0']<<endl;				//这里要加上mod,防止负数
    return 0;//输出!!!0^0   // s[i-1]-'0':字符转化为整数
}

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ACM/ICPC(ACM International Collegiate Programming Contest, 国际大学生程序设计竞)是由国际计算机界历史悠久、颇具权威性的组织ACM(Association for Computing Machinery,国际计算机协会)主办的,世界上公认的规模最大、水平最高的国际大学生程序设计竞,其目的旨在使大学生运用计算机来充分展示自己分析问题和解决问题的能力。该项竞从1970年举办至今已历29届,一直受到国际各知名大学的重视,并受到全世界各著名计算机公司的高度关注,在过去十几年中,APPLE、AT&T、MICROSOFT和IBM等世界著名信息企业分别担任了竞的赞助商。可以说,ACM国际大学生程序设计竞已成为世界各国大学生最具影响力的国际级计算机类的事,是广大爱好计算机编程的大学生展示才华的舞台,是著名大学计算机教育成果的直接体现,是信息企业与世界顶尖计算机人才对话的最好机会。   该项竞分区域预和国际决两个阶段进行,各预区第一名自动获得参加世界决的资格,世界决安排在每年的3~4月举行,而区域预安排在上一年的9~12月在各大洲举行。   ACM/ICPC的区域预是规模很大、范围很广的事。仅在2003年参加区域预的队伍就有来自75个国家(地区),1411所大学的3150支代表队,他们分别在127个场中进行比,以争夺全球总决的73个名额,其激烈程度可想而知。 2005年第30届ACM/ICPC亚洲区预共设了北京、成都、汉城、东京等11个站,来自亚洲各国知名高校的各个代表队进行了激烈的角逐。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值