hdu 5743 Join The Future

2015广东工业大学新生赛 总结+部分题解 1.心态很重要。不能以OJ垃圾来推脱比赛。大家在同一个垃圾平台,比赛仍然是公平的。但行好事莫问前程。 2.多在纸上写多推导。 B题: A 和 B 的最小公倍数 为 C*K 已知 A C 求B的个数。(A能整除C) 起初以为K是当作变量来做,但是很明显,如果K当作变量那么显然B的个数是无数个。 因为任意C*K,B都可以等于C*K. 所以,显然K要当作常量,那么K是多少其实是无所谓 阅读详情

http://acm.hdu.edu.cn/showproblem.php?pid=5743


令pre[i]为前i个数的和(mod 2)。

题中给的m个限制条件l,r,s,可以转化为pre[r] - pre[l-1] = s,就把区间转化为了点。每个限制条件表示两点间的关系 

与其他 pre[] 都没有关系的 pre[i] 可以单独考虑。   

而与其他数有限制关系 ,就至少与一个数有关。如果i和j相关,那么确定pre[i] 就能 确定pre[j] 。那么最多只要枚举n/2个pre[i],就能知道所有数的奇偶性。

所以复杂度o(2^(n/2)).


odd[i][j] 的二进制第k位,表示 pre[i]为j时,pre[k]的值

ctl[i] 的二进制第k位,表示pre[i],与pre[k]是否相关(其实ctl[i] = odd[i][0] | odd[i][1],所以可以不要这个变量)

dp[i][j]表示 pre[i]为j的方案数


#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
void fre(){freopen("t.txt","r",stdin);}
template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b>a)a = b; }
template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b<a)a = b; }
#define ls o<<1
#define rs o<<1|1
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x, y) memcpy(x, y, sizeof(x))
#define debug(x) printf("%d",x);
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
const int N = 45;
const int M = 1e9+7;
template <class T1, class T2>inline void gadd(T1 &a, T2 b) { a+=b; a%=M; }

int n,m,l[N],r[N];
LL odd[N][2],ctl[N];
int vis[N],cnt[N][2],t[N];
int dp[N][2];
int ans;
vector<int>e[N];
void get(LL sta,LL vis)
{
    int x,y,flag = 0,lst=0;
    for(int i = 1; i <= n; ++i)
    {
        if(vis>>i & 1)
        {
            y = lst ^ (sta>>i & 1);
            if(y)
            {
                if(l[i]&1) x = l[i];
                else x = l[i]+1;
            }
            else
            {
                if(l[i]&1) x = l[i]+1;
                else x = l[i];
            }
        }
        else x = l[i];
        
        if(flag) t[i] = x;
        else
        {
            if(x > t[i]) return;
            if(x < t[i]) flag = 1,t[i] = x;
        }
        lst = lst^(x&1);
    }
}
void dfs(int pos,LL sta, LL vis)
{
    if(pos == n+1)
    {
        int ret = 0;
        for(int i = 0; i < 2; ++i)
        {
            if(vis>>pos-1 & 1 && (sta>>pos-1 & 1) != i) continue;
            gadd(ret,dp[pos-1][i]);
        }
        if(ret)get(sta,vis);
        gadd(ans,ret);
        return;
    }
    
    dp[pos][0] = dp[pos][1] = 0;
    for(int i = 0; i < 2; ++i)
    {
        if(vis>>pos-1 & 1 && (sta>>pos-1 & 1) != i) continue;
        for(int j = 0; j < 2; ++j) gadd(dp[pos][i^j] , (LL)dp[pos-1][i]*cnt[pos][j]%M);
    }
    
    if(vis>>pos & 1 || e[pos].empty())  {dfs(pos+1,sta,vis);return;}
    if(dp[pos][0]) dfs(pos+1,sta|odd[pos][0],vis|ctl[pos]);
    if(dp[pos][1]) dfs(pos+1,sta|odd[pos][1],vis|ctl[pos]);
    
}
void solve()
{
    MS(odd,0),MS(ctl,0);
    scanf("%d%d",&n,&m);
    for(int i = 1; i <= n; ++i)
    {
        scanf("%d%d",&l[i],&r[i]);
        if(l[i] & 1) cnt[i][1] = (r[i]-l[i])/2+1, cnt[i][0] = r[i]-l[i]+1 - cnt[i][1];
        else cnt[i][0] = (r[i]-l[i])/2+1, cnt[i][1] = r[i]-l[i]+1 - cnt[i][0];
    }
    
    int u,v,s;
    for(int i = 0; i <= n; ++i) e[i].clear(),t[i] = M;
    for(int i = 1; i <= m; ++i)
    {
        scanf("%d%d%d",&u,&v,&s); u--;
        e[u].push_back(v<<1 | s);
        e[v].push_back(u<<1 | s);
    }
    
    for(int i = 0; i <= n; ++i)
    {
        MS(vis,-1);
        queue<int>q; vis[i] = 1;
        q.push(i);
        while(!q.empty())
        {
            u = q.front(); q.pop();
            ctl[i] |= 1ll<<u; odd[i][vis[u]] |= 1ll<<u;
            for(int j = e[u].size()-1; ~j; --j)
            {
                v = e[u][j]>>1; s = e[u][j]&1;
                if(vis[v] != -1)
                {
                    if(vis[v] != (vis[u]^s))
                    {
                        printf("0\n-1\n");
                        return;
                    }
                }
                else
                {
                    vis[v] = vis[u]^s;
                    q.push(v);
                }
            }
        }
    }
    
    ans = 0;
    dfs(1,odd[0][0],ctl[0]);
    if(t[1] == M)
    {
        printf("0\n-1\n");
        return;
    }
    printf("%d\n",ans);
    for(int i = 1; i <= n; ++i) printf("%d%c",t[i],i==n?'\n':' ');
}
int main()
{
    dp[0][0] = 1;
    int T;
    scanf("%d",&T);
    while(T--)solve();
    return 0;
}


九余数定理及证明 hdu 1163 九余数定理: 一个数对九取余后的结果称为九余数。 一个数的各位数字之和想加后得到的 证明借鉴了网络上的证明,加以修改: 首先证明前有两个基本需要知道的规律  1.和的模 等于 模的和再取模 如:(15+7)%3 = (15%3+7%3)%3 逆运算亦可 2.积的模 等于 模的积再取模 如:(15*7)%3 = (15%3 * 7%3) %3 逆运算亦可 阅读详情

相关推荐

01串出现奇数个1的方案数 2016四川省赛 Odd Discount

题目链接:https://acm.bnu.edu.cn/v3/problem_show.php?pid=52300先证明结论,后说题目; 结论1:长度为n的01序列出现奇数个1的方案为总方案的1/2(即出现奇数个1和出现偶数个1的方案数相等) 证明:(数学归纳法) n=1的情况,显然成立; 如果n=i成立:那么再额外增加1个1,奇数个1和偶数个1的方案会对调;再额外增加1个0,奇数个1和偶数

QZQ 2265

HDU 5743 Join The Future 给定部分区间和奇偶,和数字范围,求方案数 DP

HDU 5743 Join The Future

ACMer不要报考高校代码为13627的移通学院! 634

EC20模块实战:5步搞定MQTT连接阿里云IoT(附常见错误排查)

本文详细介绍了使用EC20 4G模块通过AT指令连接阿里云IoT平台的完整实战流程。文章以智能农业项目为背景,从硬件接线、网络注册、PDP激活,到MQTT连接配置、一型一密动态注册及数据收发,提供了清晰的5步操作指南,并重点附上了常见错误排查方法,帮助开发者快速实现稳定可靠的物联网设备上云。

weixin_29209801的博客 196

【HDU5743 2016 Multi-University Training Contest 2J】【dfs展开式DP 前缀和思想】Join The Future 40个数已知区间和为奇或偶输出方案

Join The Future Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 118    Accepted Submission(s): 43 Problem Description Professor Zhang

snowy_smile的博客 908

【ZYNQ驱动双AD9361实战】(一)从官方参考设计到自定义移植

本文详细介绍了如何将ADI官方的单AD9361参考设计移植到ZYNQ平台以驱动双AD9361射频板卡。内容涵盖从环境搭建、官方工程架构解析,到硬件HDL工程修改(包括顶层设计、引脚分配及TCL脚本适配)以及Linux设备树软件配置的全流程实战指南,帮助开发者实现自定义双通道射频收发系统。

weixin_29170327的博客 362

STM32与AD7606的SPI通信优化:提升高精度数据采集效率

本文深入探讨了STM32与AD7606的SPI通信优化策略,旨在提升高精度数据采集系统的效率与稳定性。文章从硬件连接、电源去耦、PCB布局等基础环节入手,详细解析了软件驱动中SPI模式配置、DMA应用及精准时序控制等关键优化技术,并提出了系统级的性能提升方案,帮助开发者解决高速采样下的数据跳动、效率瓶颈等实际问题。

weixin_29192211的博客 392

HDU5743 多校2.9

题目大意:求(a1+a2)/sum的最大值 思路:分子尽可能大就好 #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #pragma comm

风一样的自由,色彩斑斓的雨季 435

告别抓包:一个Xposed模块教你监控抖音App的本地数据变化

本文详细介绍了如何利用Xposed框架开发模块,实现抖音App本地数据监控的技术方案。通过Hook关键方法,开发者可以实时获取用户信息、推荐算法参数等核心数据,无需Root设备即可高效调试。文章包含完整的环境配置、代码实现和优化技巧,为移动应用开发与测试提供创新解决方案。

weixin_27015733的博客 384

【HDU】5743 Join The Future【dp】

题目链接:Join The Future并查集压缩相等的点,发现最多只会有20个大于1的联通块,状压dp即可#include <bits/stdc++.h> using namespace std ;typedef long long LL ;#define clr( a , x ) memset ( a , x , sizeof a )const int MAXN = 42 ; const int

poursoul 577

什么是 SAPGUI 里的 Logon Group/Server

这意味着,不同的用户连接可以被分配到不同的应用服务器,以实现均衡的资源利用和降低某一服务器的负载压力。在这种配置下,欧洲的用户登录时选择“EUROPE_GROUP”,系统将自动选择一个位于欧洲的数据中心的服务器进行连接,这样不仅减少了网络延迟,还实现了服务器间的负载均衡。用户在 SAPGUI 中登录时,只需选择相应的 Logon Group(例如“FIN_GROUP”),系统就会自动将他们的连接请求分配到当前负载最小的应用服务器上,这种动态分配大大提升了系统的响应速度和稳定性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1069

LIS2DH三轴加速度传感器原理图设计,已量产(加速度传感器)

最近在做一款可穿戴设备原型时,选了 LIS2DH 这款加速度计 —— 比起之前常用的 ADXL345,它在低功耗和稳定性上的优化刚好戳中了可穿戴设备 “续航 + 可靠” 的核心需求。下面结合这次画的原理图,聊聊这个小模块的硬件设计细节。

不脱发的程序猿 388

hdu Calendar Game (博弈论奇偶性找规律)

博弈论 找规律,每步有两个方案,天数加一或者月数加一,找规律发现月数和天数之和的奇偶性都会发生变化,除了两个特殊日期,9.30和11.30.他们加一会变为10.1和12.1,和为奇数不变,单独讨论。 若开局和是偶数如(11.3),则先手必胜,他就不会主动进入特殊的日期来改变对手的奇偶性, 若开局和是奇数,则先手必败,而且+1也只能从奇数变到偶数,不可能进入特殊日期,所以也不会进入 所以只能

Jeromiewn的博客 816

Python爬虫实战:利用Selenium与Playwright抓取美团外卖数据

在当今大数据时代,网络数据采集已成为商业分析和市场研究的重要手段。本文以美团外卖平台为例,详细介绍如何使用Python最新爬虫技术(Selenium、Playwright)进行数据采集,并探讨相关技术原理、反爬应对策略及数据存储方案。通过5000+字的详细讲解和完整代码示例,帮助读者掌握现代网络爬虫开发的核心技能。本文详细介绍了使用Python最新爬虫技术采集美团外卖数据的完整流程,涵盖了从环境配置、页面分析到数据存储的全链路解决方案。

2201_76125261的博客 2550

The 36th ACM/ICPC Asia Regional Fuzhou Site / 1001 A Card Game 简证

题目链接 这题题意描述得相当烦有木有!?其实就是M种牌放到M堆里,M种牌和M堆都是从1~M编号的。输入 M, 然后输入M个数,表示M种牌分别有多少张,同时也表示M堆分别的最大容量是多少。游戏是这样玩的,从第一堆开始由顶向下取(简单起见),取到的牌属于第k种,就接着到第k堆取。当任何一次取不到牌时,游戏结束。求游戏结束时牌恰好被取完的概率。 分析:假设取的牌顺序是一个序列,那么这种序列在末尾为1...

weixin_34418883的博客 155

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

HDU4038-Stone(思维题)

Stone Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 2267    Accepted Submission(s): 568 Problem Description Given an array of int

mowayao的专栏 823

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

HDU 6048 Puzzle 逆序对 计数 发现基本操作

8数码问题的扩展,给定一个n*m的局面,问是否有解。局面按题目规则生成。 将此问题称作扩展8数码问题的话,通过观察基本操作可以发现,对于x,在只影响x右下角格子的前提下,我们一定可以移到指定的位置。这样我们可以依次将1,2,3,...等格子归位。只剩下右下角四个格子的顺序不定。严格的说,是(n,m-1)与(n-1,m)的格子不能确定是否恰好在其位置上。枚举最简单的2*2情况可以发现,将数

亂丟程式碼的天空 411

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

hdu 2032

水题 AC代码: #include int main() { int a[31][31]; int i,j,n; a[1][1]=a[2][1]=a[2][2]=1; for(i=3;i<=30;i++) { for(j=2;j<i;j++)

夜风 694

HDU 6129 Just do it

题目链接 题目意思给你一个包含n个数的序列A和一个数m,序列B中的数是序列A经过异或得到的,比如:b[i]=a[1]^a[2]^…..^a[i]。现在让你求经过m次异或后,序列B的值。解题思路我们写下其前五项的值可以发现我们设定ans【i】【j】表示进行到第i次,第j个位子的答案的话,ans【i】【j】有推导式:ans【i】【j】=ans【i-1】【j】^ans【i】【j-1】; 从图中我们可以看

长颜草的博客 1649

hdu 1391

Number Steps Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2681    Accepted Submission(s): 1650 Problem Description Starting from poi

ysc504的专栏 421

HDU 5316 Magician

题意:给你一个数列,然后要有两种操作。操作1 x y 代表把数列的第x个数字改成y     操作0 x y 代表在a[x]....a[y]间找到一个beautiful 子序列的和最大 beautiful 子序列就是相邻的两个数在原来的数列的位子的奇偶性不一样 如a[1],a[4],a[5]就是,但a[2],a[4],就不是,因为2、4的奇偶性一样。 思路:线段树,用一个结构体去保存某段的b

Mr_Xujh的博客 499

最大团 极大团 Bron–Kerbosch算法 poj 2989

昨日老刘开了最大团专题后,起初以为挺简单,后来发现有点麻烦。能用的资料又很少。分享一下学习的东西 以poj 2989为例,题意是求 不同极大团的数量 要用Bron–Kerbosch算法 首先是最朴素的伪代码,没有任何剪枝(来自维基百科)https://en.wikipedia.org/wiki/Bron%E2%80%93Kerbosch_algorithm Bro

QZQ 9354

Educational Codeforces Round 8 D - Magic Numbers 数位DP

题意很简单,偶数位为d,奇数位不为d,且能被m整除的数,叫d-magic,给定d,m,a,b,求在[a,b]上d-magic的个数。 注意 1 既是 0-magic 又是 2/3/4/5/6/7/8/9-magic  还有值得注意的是,给定的a,b 数位相同。 一开始没用到这个条件,写得挺麻烦~ #include #include #include #include #include #in

QZQ 8373

二分图 最小覆盖数 = 最大匹配数、最大独立集 = 总数-最小覆盖集 证明 hdu 1068

二分图有两个定理:最小覆盖数=最大匹配数、最大独立集=总数-最小覆盖集 。 这里来给出证明(如果还不懂匈牙利算法,请先看之前写的一篇)匈牙利算法链接 几个基本定义: 最小覆盖:即在所有顶点中选择最少的顶点来覆盖所有的边。 最大匹配:二分图左右两个点集中,选择有边相连的两个匹配成一对(每个点只能匹配一次),所能达到的最大匹配数。 最大独立集:集合中的任何两个点都不直接相连。 最小覆盖数=

QZQ 5814

hdu 5304 基尔霍夫矩阵

关于基尔霍夫矩阵: *算法引入: *给定一个无向图G,求它生成树的个数t(G); * *算法思想: *(1)G的度数矩阵D[G]是一个n*n的矩阵,并且满足:当i≠j时,dij=0;当i=j时,dij等于vi的度数; *(2)G的邻接矩阵A[G]是一个n*n的矩阵,并且满足:如果vi,vj之间有边直接相连,则aij=1,否则为0; *定义图G的Kirchhoff矩阵C[G

QZQ 2593

hdu 2089 数位DP初探

数位DP 优秀的 教学 :http://wenku.baidu.com/link?url=o3ER_gVCyB0qcKthM-Y8vPtAGZ_u5bzOu_gUCUhPcXC6YfaSDgtBSXNEEvvGvSzyuDE9TULcPNsDrRd9IUtQVHeKUVrnPUjyfWjCly_J7Xq #include #include #include #include #defin

QZQ 2314
上一篇: hdu 5741 Helter Skelter 官方题解做法的详细证明
下一篇: Hdu 5514 类莫比乌斯函数 容斥原理
QZQmmmm
博客等级 码龄11年 77粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值