P1356 数列的整除性
dp百题进度条[2/100]
题目描述
对于任意一个整数数列,我们可以在每两个整数中间任意放一个符号'+'或'-',这样就可以构成一个表达式,也就可以计算出表达式的值。比如,现在有一个整数数列:17,5,-21,-15,那么就可以构造出8个表达式:
17+5+(-21)+15=16
17+5+(-21)-15=-14
17+5-(-21)+15=58
17+5-(-21)-15=28
17-5+(-21)+15=6
17-5+(-21)-15=-24
17-5-(-21)+15=48
17-5-(-21)-15=18
对于一个整数数列来说,我们能通过如上的方法构造出不同的表达式,从而得到不同的数值,如果该数值能够被k整除的话,那么我们就称该数列能被k整除。 在上面的例子中,该数列能被7整除(17+5+(-21)-15=--14),但不能被5整除。现在你的任务是,判断某个数列是否能被某数整除。
输入格式
第一行是一个整数m,表示有m个子任务。接下来就是m个子任务的描述。 每个子任务有两行。第一行是两个整数n和k(1<=n<=10000, 2<=k<=100),n和k中间有一个空格。n 表示数列中整数的个数;k就是需要你判断的这个数列是否能被k 整除。第二行是数列的n个整数,整数间用空格隔开,每个数的绝对值都不超过10000。
输出格式
输出文件应有m 行,依次对应输入文件中的m 个子任务,若数列能被k 整除则输出 "Divisible",否则输出 "Not divisible" ,行首行末应没有空格。
输入输出样例
输入 #1
2
4 7
17 5 -21 15
4 5
17 5 -21 15
输出 #1
Divisible
Not divisible
思路一:正常的dp
0/1背包,自己看就好惹
Code
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 10005;
int x,k,n;
bool dp[MAXN][1005];
inline int mod(int x){
    x %= k;
    if (x < 0) x += k;
    return x;
}
int main(){
	int t;
    scanf("%d",&t);
    while (t--){
        scanf("%d %d",&n,&k);
        memset(dp,false,sizeof(dp));
        scanf("%d",&x);
        dp[0][mod(x)] = true;
		dp[0][mod(-x)] = true;
        for (register int i = 1 ; i < n ; i++){
            scanf("%d",&x);
            x = mod(x);
            for (register int j = 0 ; j < k ; j++){
				dp[i][j] = dp[i - 1][mod(j - x)] | dp[i - 1][mod(j + x)];
			}
        }
        if (t == 0){
        	if (dp[n - 1][0] == true) printf("Divisible");
			else printf("Not divisible");
		}
		else{
			if (dp[n - 1][0] == true) printf("Divisible\n");
			else printf("Not divisible\n");
		}
    }
    return 0;
}
思路二(我很钦佩的一种做法):
随机化算法,完全看脸
Code(别人的):
#include<cstdio>
#include<cstdlib>
using namespace std;
int a[10001];
int i,n,T,k,randomm,ans;
int main( )
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&k);
        for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
        int tot=500,flag=0;
        while(tot)
        {
            tot--;
            ans=0;
            for(i=1;i<=n;i++)
            {
                randomm=rand();
                if(randomm%2)
                    ans+=a[i];
                else
                    ans-=a[i];
            }
            if(ans%k==0)
            {
                printf("Divisible\n");
                flag=1;
                break;
            }
        }
        if(!flag) printf("Not divisible\n");
    }
    return 0;
}
												
											P1356 数列的整除性的更多相关文章
- P1356 数列的整数性
		
P1356 数列的整数性打的骗分,在多组数据的情况下还能骗到分,可以了.又TMD是dp.f[i][j]表示+-第i个数能否达到%p后的余数j,如果f[n][0]==true就可以. #include& ...
 - 洛谷 P1356 数列的整数性 解题报告
		
P1356 数列的整数性 题目描述 对于任意一个整数数列,我们可以在每两个整数中间任意放一个符号'+'或'-',这样就可以构成一个表达式,也就可以计算出表达式的值.比如,现在有一个整数数列:17,5, ...
 - 【u028】数列的整除性
		
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 对于任意一个整数数列,我们可以在每两个整数中间任意放一个符号'+'或'-',这样就可以构成一个表达式, ...
 - luogu P1356 数列的整数性 |动态规划
		
题目描述 对于任意一个整数数列,我们可以在每两个整数中间任意放一个符号'+'或'-',这样就可以构成一个表达式,也就可以计算出表达式的值.比如,现在有一个整数数列:17,5,-2,-15,那么就可以构 ...
 - C#求斐波那契数列第30项的值(递归和非递归)
		
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
 - BZOJ1500[NOI2005]维修数列
		
Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一 ...
 - PAT 1049. 数列的片段和(20)
		
给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列{0.1, 0.2, 0.3, 0.4},我们有(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1 ...
 - 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)
		
对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...
 - fibonacci数列(五种)
		
自己没动脑子,大部分内容转自:http://www.jb51.net/article/37286.htm 斐波拉契数列,看起来好像谁都会写,不过它写的方式却有好多种,不管用不用的上,先留下来再说. 1 ...
 
随机推荐
- 翻转二叉树(深搜-先序遍历-交换Node)
			
题目:翻转二叉树,例如 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 已知二叉树的节点定义如下: class TreeNode { in ...
 - luogu P2812 校园网络【[USACO]Network of Schools加强版】|Tarjan
			
题目背景 浙江省的几所OI强校的神犇发明了一种人工智能,可以AC任何题目,所以他们决定建立一个网络来共享这个软件.但是由于他们脑力劳动过多导致全身无力身体被♂掏♂空,他们来找你帮助他们. 题目描述 共 ...
 - vue脚手架安装,新建项目,打包
			
1.安装node.js 从node官网下载并安装node,安装步骤很简单,只要一路“next”就可以了. 2.安装cnpm 淘宝镜像 npm install -g cnpm --registry=ht ...
 - Pandas学习(一)——数据的导入
			
欢迎加入python学习交流群 667279387 学习笔记汇总 Pandas学习(一)–数据的导入 pandas学习(二)–双色球数据分析 pandas学习(三)–NAB球员薪资分析 pandas学 ...
 - MyBatis之MyBatis Generator逆向工程
			
官网地址 http://mybatis.org/generator/ 下载地址 http://central.maven.org/maven2/org/mybatis/generator/mybati ...
 - Python网络爬虫入门实战(爬取最近7天的天气以及最高/最低气温)
			
_ 前言 本文文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: Bo_wen 最近两天学习了一下python,并自己写了一个 ...
 - Day 02  计算机的基本组成及工作原理
			
目录 计算机的构成 CPU 控制器 运算器 存储器 内存 外存 I/O (input & output) 输入设备 输出设备 什么是编程语言 什么是编程 为什么要编程 多核CPU 32位和64 ...
 - 小白学 Python 爬虫(20):Xpath 进阶
			
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
 - leetcode-164、最大间距
			
export default (arr) => { // 如果数组长度小于2返回0 if (arr.length < 2) { return 0 } // 排序 arr.sort() // ...
 - docker安装与配置
			
Docker与虚拟化技术的区别 虚拟机分配多少宿主机就减少多少资源,比如VMware1分配了2Gb内存,如果运行5Gb的应用程序会造成内存溢出,vmware2分配了2Gb内存,如果运行2Gb的应用程序 ...