【比赛】【树上路径(phantasm)】

【比赛】【树上路径(phantasm)】—恢复内容开始—题目大意:求1,2,…,n有多少个长为m的子序列a,满足  a1=1,am=n  ∀i,ai+1−ai≥k保证这样的子序列存在。只需判断方案数的奇偶性。数据有T组。n,m,k≤109,T≤2×106.//dfs枚举集合//复杂度预估O(T*2^n)/…

大家好,又见面了,我是你们的朋友全栈君。

—恢复内容开始—

题目大意:

求 1, 2, …, n 有多少个长为 m 的子序列 a,

满足

   a1 = 1,am = n

   ∀i, ai+1 − ai ≥ k

保证这样的子序列存在。只需判断方案数的奇偶性。数据有 T 组。 n, m, k ≤ 109 , T ≤ 2 × 106 .

【比赛】【树上路径(phantasm)】

//dfs枚举集合
//复杂度预估 O(T*2^n)
//不用数组 得分30 
//针对前6个点
#include<cstdio>
#include<cstdlib>
using namespace std;
int t,n,m,k; 
int sum;

void dfs(int pos,int x)
{
    if(pos==m) 
    {
        if(x==n)
            sum=(sum+1)%2
        return ;
    }
    for(int i=x+k;i<=n;i++)
        dfs(pos+1,i);
}

int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&n,&m,&k);
        sum=0;
        dfs(1,1);
        if(sum) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

对于第8个点

        {
                scanf("%d%d%d",&n,&m,&k);
        if(m==2) printf("Yes\n");                                   
        else if(m==3) 
        {
            sum=n-(k<<1);
            if(sum%2==1) printf("Yes\n");
            else printf("No\n");
        }
        else
        {
            sum=0;
            dfs(1,1);
            if(sum) printf("Yes\n");
            else printf("No\n");
        }     
    }

//2记忆化 
//dfs->dp //f[i][j]表示第i步,位置为j //因为状态转移方程中的k为变量,所以还是得分k的大小来dp //f[k][i][j] // 55 分
#include<cstdio> 
#include
<cstdlib>
#include
<algorithm>
#include
<cstring>
using namespace std;

int tt,nn,mm,kk;
int f[203][203][203];//1:true
inline int read()
{
  int x=0;char c=getchar();
  while(c<'0' || c>'9') c=getchar();
  while(c>='0' && c<='9') x=(x<<1)+(x<<3)+c-'0',c=getchar();
  return x;
}
int dfs(int n,int m,int k)
{
  if(f[k][m][n]!=-1) return f[k][m][n];
  if(m==1) return f[k][m][n]=0;
  if(m==2 )
    if(n>k) return f[k][m][n]=1;
    else return f[k][m][n]=0;
  int s=k ,t=n-k*(m-2),as=0;
  for(int i=s;i<=t;i++)
    as=(as+dfs(n-i,m-1,k))%2;
  return f[k][m][n]=as;
}

int main()
{
  tt
=read();
  memset(f,
-1,sizeof(f));
  for(int i=1;i<=tt;i++)
  {
    nn
=read(),mm=read(),kk=read();
    if(mm==2) printf("Yes\n");
    else if(mm==3)
    {
      int sum=nn-(mm-1)*kk;
      if(sum%2!=0) printf("Yes\n");
      else printf("No\n");
    }
    else if( dfs(nn,mm,kk) ) printf("Yes\n");
    else printf("No\n"); }
   return 0;
}

90分算法(n,m,k<=5000) 

推式子。

注意到第二条约束与 a 的差分序列有关,考虑统计差分序列 bi = ai+1 − ai。

序列 b 需要满足

∀i, bi 是 [k, n] 上的整数

∑bi = n − 1

由于 a1 = 1 已确定,可以发现所有满足以上约束的长为 m − 1 的序列 b 与原来的序列 a 一一对应。

 

有限项的正整数序列的和确定时,其方案数可以用隔板法计 算,

所以构造 ci = bi − (k − 1) 来去除第一条约束,

序列 c 满足

∀i, ci 是正整数

∑m−1  ci = n − 1 − (m − 1)(k − 1)

#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int t,nn,mm,kk;
struct node
{
    
    //m=m-2 
    int id,n,m;//n=n-2-(m-1)(k-1)
    bool operator < (const node & o) const
    {
        if(n!=o.n) return n<o.n;
        else return m<o.m;
    }
}ask[2000003];
bool ans[2000003],f[5003];

int main()
{
    scanf("%d",&t);
    for(int i=0;i<t;i++)
        scanf("%d %d %d",&nn,&mm,&kk),
        ask[i].n =nn-2-(mm-1)*(kk-1),ask[i].m =mm-2,ask[i].id =i;
    sort(ask,ask+t);
    
    int nw=0,nwn=1;
    nn=ask[nw].n ;
    f[0]=true;
    while(nw<t)
    {
        for(int i=nwn;i<=nn;i++)
            for(int j=i;j>=0;j--)
                f[j]^=f[j-1];
        nwn=nn+1;
        
        while(ask[nw].n ==nn)
            ans[ask[nw].id ]=f[ask[nw].m ],nw++;
        
        nn=ask[nw].n ;
    }
    
    for(int i=0;i<t;i++)
        if(ans[i]) printf("Yes\n");
        else printf("No\n");
        
    return 0;
}

100分算法

(解决两个1e9的超大点)

由 Lucas 定理,( n k ) ≡ 1 (mod 2)

当且仅当二进制下 k 的各 位都不大于 n 的对应位,即 n and k = k,

其中 and 为二进制按 位与。 复杂度:O(T)。

#include <cstdio>
#include <cstdlib>
using namespace std;
int t,n,m,k;
int main ()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&n,&m,&k);
        int a=n-(m-1)*(k-1)-2;
        int b=m-2;
        if((a&b)==b)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/xwww666666/p/11325852.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/139060.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 我的学习历程

    我的学习历程@[TOC]不负青春,加油干!自我介绍及共勉大家好!我是一名准大三学生,进入编程的大门已经2年的时间,从大一的css与html再到大二的java,javaweb,数据结构与算法(想哭的有没有),mysql,javascript,vue.js,javaee。我从一个啥也不会的小白转变成一个啥都想尝试的大白其中有艰难(调试bug弄了一晚上)有失落(参加蓝桥杯没拿奖)有幸福(用程序给女朋友写了个生日祝福软件)有迷茫(不知道前面的路该怎么选择)。刚进入这个圈子是因为觉得弄计算机的人特别酷,觉得黑客是这个世

    2022年10月5日
  • wxPython教程(一)

    wxPython教程(一)wxPython教程(一)—wxPython窗口wxPython是Python编程语言的GUI工具包。wxPython可用于创建图形用户界面(GUI)。使用wxPython创建的应用程序在所有平台上都具有原生外观。与QT或Tk不同,该应用程序将显示为本机应用程序,具有自定义QT或Tk外观。它可在所有主要桌面平台上运行。目前支持的操作系统是MicrosoftWindows,大多数Unix或类Unix系统以及MacintoshOSX.wxPython模块

    2022年5月11日
  • vue和layUi对比

    vue和layUi对比vue和layUi对比vue(angular,react)这些框架会负责数据和视图的绑定,数据变了,视图自动更新,视图发生事件,也会更新数据,很省事。layui(bootstrap,extjs)这类库,感觉不是框架,而是组件库,会提供一些组件(比如表格,树),只提供外观和行为,不提供和数据的绑定,数据变了,你负责刷新;视图变了,你自己获取数据。vue的界面库elementui和layui都是组件库,区别就是数据和视图是不是关联的。layui其实更偏向与后端开发人员使用,在服务端页面上有非常好的效果

    2022年6月25日
  • 虚拟ip地址是如何实现的_虚拟服务器ip地址

    虚拟ip地址是如何实现的_虚拟服务器ip地址ARP是地址分析协议,其作用简单,将ip地址转换为MAC地址,使用于数据链路层。每个主机都有一个ARP高速缓存,存储同一网络中的IP地址与MAC地址之间的对应关系,当以太网中的主机发送数据时,首先要从该缓存中查询与目标IP相对应的MAC地址,并将数据发送到该MAC地址。该系统将自动维护此缓存。ARP高速缓存可以在Linux下使用arp命令。例如,物理机器A(IP为172.25.0.1)和物理机器B…

    2022年10月12日
  • ICMP报文的类型

    ICMP报文的类型ICMP经常被认为是IP层的一个组成部分。它传递差错报文以及其他需要注意的信息。ICMP报文通常被IP层或更高层协议(TCP或UDP)使用。一些ICMP报文把差错报文返回给用户进程。ICMP报文是在IP数据报内部被传输的,如图6-1所示。ICMP的正式规范参见RFC792[Posterl1981b]。ICMP…

    2022年5月29日
  • yarn一些最佳配置

    yarn一些最佳配置

    2021年11月27日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号