zoukankan      html  css  js  c++  java
  • LightOJ1125 Divisible Group Sums

    Divisible Group Sums

    Given a list of N numbers you will be allowed to choose any M of them. So you can choose in NCM ways. You will have to determine how many of these chosen groups have a sum, which is divisible by D.

    Input

    Input starts with an integer T (≤ 20), denoting the number of test cases.

    The first line of each case contains two integers N (0 < N ≤ 200) and Q (0 < Q ≤ 10). Here N indicates how many numbers are there and Q is the total number of queries. Each of the next N lines contains one 32 bit signed integer. The queries will have to be answered based on these N numbers. Each of the next Q lines contains two integers D (0 < D ≤ 20) and M (0 < M ≤ 10).

    Output

    For each case, print the case number in a line. Then for each query, print the number of desired groups in a single line.

    Sample Input

    2

    10 2

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    5 1

    5 2

    5 1

    2

    3

    4

    5

    6

    6 2

    Sample Output

    Case 1:

    2

    9

    Case 2:

    1

    从n个数字里面取m个有C(n,m)种取法,问有多少种取法使得总和是D的倍数

    因为询问好多组(m,d),所以每次都要对不同的d先取模,然后显然就是个背包啦,数字不超过d,只取m个,最大容量只有200

    然后特么给的ai还有负数,,,我真是,,,

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<cstdlib>
     5 #include<algorithm>
     6 #include<cmath>
     7 #include<queue>
     8 #include<deque>
     9 #include<set>
    10 #include<map>
    11 #include<ctime>
    12 #define LL long long
    13 #define inf 0x7ffffff
    14 #define pa pair<LL,int>
    15 #define mkp(a,b) make_pair(a,b)
    16 using namespace std;
    17 inline LL read()
    18 {
    19     LL x=0,f=1;char ch=getchar();
    20     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    21     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    22     return x*f;
    23 }
    24 int n,q;
    25 int a[210];
    26 int b[210];
    27 LL f[210][210];
    28 inline void work(int cur)
    29 {
    30     printf("Case %d:
    ",cur);
    31     n=read();q=read();
    32     for (int i=1;i<=n;i++)a[i]=read();
    33     for (int i=1;i<=q;i++)
    34     {
    35         int mod=read(),m=read();
    36         memset(f,0,sizeof(f));f[0][0]=1;
    37         for (int j=1;j<=n;j++)b[j]=(a[j]%mod+mod)%mod;
    38         for (int j=1;j<=n;j++)
    39         {
    40             for (int k=m;k>=1;k--)
    41                 for (int l=m*mod;l>=b[j];l--)
    42                 f[k][l]+=f[k-1][l-b[j]];
    43         }
    44         LL sum=0;
    45         for (int j=0;j<=m*mod;j+=mod)sum+=f[m][j];
    46         printf("%lld
    ",sum);
    47     }
    48 }
    49 int main()
    50 {
    51     int T=read(),tt=0;
    52     while (T--)work(++tt);
    53 }
    LightOJ 1125
    ——by zhber,转载请注明来源
  • 相关阅读:
    141. Linked List Cycle
    2. Add Two Numbers
    234. Palindrome Linked List
    817. Linked List Components
    《算法图解》之快速排序
    C++-对象指针的滥用
    C++学习书籍评价
    C++-随机数的产生
    Java-重载和重写区别剖析
    Qt- 图形界面应用程序的运行模式
  • 原文地址:https://www.cnblogs.com/zhber/p/7152734.html
Copyright © 2011-2022 走看看