水题解析——7的倍数
题面:
【题目名称】7的倍数
【时间限制】每个测试点300ms
【空间限制】128M
【题目描述】
给定一个各项均不相同且项数为n的正整数数列:A1,A2,A3,……,An.从中选取若干个数(至少一个),使这些数之和为7的倍数.求共有多少种不同的选法.
测试数据分为两类:
A类:数列由输入数据直接给出;
B类:给定k(k<=100000)个正整数:p1,p2,p3,……,pk.数列由通项公式:
An=p1^n+p2^n+p3^n+……+pk^n确定.
【输入格式】
第一行,两个整数n,k:其中n表示数列项数.若k=0,则表示该组数据为A类数据;若k>0,则表示该组数据为B类数据.
第二行,若为A类数据,则接下来有n个互不相同的正整数,其中第i个数表示数列的第i项;若为B类数据,则接下来有k个正整数:p1,p2,p3,…,pk.(具体含义见题目描述)
【输出格式】
一个非负整数,表示共有多少种选法.由于答案可能很大,请mod 1000000007后输出.
【样例输入1】
6 0
1 2 3 4 5 6
【样例输出1】
9
【样例输入2】
4 2
3 5
【样例输出2】
2
【数据范围与约定】
对于20%的数据,k=0,1<=n<=20;
对于60%的数据,k=0,1<=n<=100000;
对于另 40%的数据,1<=k<=10^5,1<=n<=10^18.
数据:
这题数据并没有什么特别之处,在此就不提供数据了。
题解:
20分算法:搜索
只处理A类数据.
- 很裸很裸的暴力搜索;
- 依次枚举每个数选与不选;
- 然后验证并计数;
- 时间复杂度O(2^n).
20分暴搜代码:
#include<cstdio>
#define mod 1000000007
int n,k,A[1100],cnt=0;
void dfs(int p,int num)
{
if(p>n)
{
cnt+=(num%7==0);
if(cnt>mod)
{
cnt-=mod;
}
return ;
}
dfs(p+1,num);
dfs(p+1,num+A[p]);
return ;
}
int main()
{
scanf("%d%d",&n,&k);//只处理A类数据;
for(int i=1;i<=n;i++)
{
scanf("%d",&A[i]);
}
dfs(1,0);//深搜;