zoukankan      html  css  js  c++  java
  • TLE

    TLE - Time Limit Exceeded

    no tags 

    Given integers N (1 ≤ N ≤ 50) and M (1 ≤ M ≤ 15), compute the number of sequences a1, ..., aN such that:

    • 0 ≤ ai < 2M
    • ai is not divisible by ci (0 < ci ≤ 2M)
    • ai & ai+1 = 0 (that is, ai and ai+1 have no common bits in their binary representation)

    Input

    The first line contains the number of test cases, T (1 ≤ T ≤ 10). For each test case, the first line contains the integers N and M, and the second line contains the integers c1, ..., cN.

    Output

    For each test case, output a single integer: the number of sequences described above, modulo 1,000,000,000.

    Example

    Input:
    1
    2 2
    3 2
    
    Output:
    1
    

    The only possible sequence is 2, 1.

    分析:考虑相邻a[i]&a[i+1]=0;

       初始化状态转移为dp[i][j]=dp[i-1][j^((1<<m)-1)];

       dp[i][j]表示第i步为j的方案数;

       其次,若j&k=j,则dp[i][j]也应包含dp[i][k],这个可以推回去与一下;

       dp[i][j]=Σdp[i][k],j&k=j,这个即为高维前缀和;

       剩下不被整除特判一下即可;

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    #include <climits>
    #include <cstring>
    #include <string>
    #include <set>
    #include <bitset>
    #include <map>
    #include <queue>
    #include <stack>
    #include <vector>
    #define rep(i,m,n) for(i=m;i<=n;i++)
    #define mod 1000000000
    #define inf 0x3f3f3f3f
    #define vi vector<int>
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define ll long long
    #define pi acos(-1.0)
    #define pii pair<int,int>
    #define sys system("pause")
    const int maxn=1e5+10;
    const int N=2e2+10;
    using namespace std;
    ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
    ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;}
    int n,m,k,t,a[51],dp[51][1<<15];
    int main()
    {
        int i,j;
        scanf("%d",&t);
        while(t--)
        {
            memset(dp,0,sizeof(dp));
            scanf("%d%d",&n,&m);
            rep(i,1,n)scanf("%d",&a[i]);
            rep(i,0,(1<<m)-1)if(i%a[1]!=0)dp[1][i]++;
            rep(i,2,n)
            {
                rep(j,0,(1<<m)-1)dp[i][j]=dp[i-1][j^((1<<m)-1)];
                rep(j,0,m-1)
                {
                    rep(k,0,(1<<m)-1)
                    {
                        if((~k)&(1<<j))(dp[i][k]+=dp[i][k^(1<<j)])%=mod;
                    }
                }
                for(j=0;j<(1<<m);j+=a[i])dp[i][j]=0;
            }
            ll ret=0;
            rep(i,0,(1<<m)-1)(ret+=dp[n][i])%=mod;
            printf("%lld
    ",ret);
        }
        return 0;
    }
  • 相关阅读:
    git命令回退代码并同步到远程仓库
    git拉取远程指定分支
    vue动态绑定样式
    友链
    css三大特性
    CSS的背景background
    元素显示模式(块元素、行内元素、行内块元素)
    CSS复合选择器
    快速生成HTML结构+CSS样式语法
    文本属性
  • 原文地址:https://www.cnblogs.com/dyzll/p/6536813.html
Copyright © 2011-2022 走看看