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 ... 
随机推荐
- pod install速度慢解决方案
			相信大家已经感受到pod install速度越来越慢了,网上提供了几种解决方案,但是都没有完全解决速度慢的问题. 使用国内镜像的Specs 在pod install时使用命令pod install - ... 
- 源码分析 RocketMQ DLedger 多副本存储实现
			目录 1.DLedger 存储相关类图 1.1 DLedgerStore 1.2 DLedgerMemoryStore 1.3 DLedgerMmapFileStore 2.DLedger 存储 对标 ... 
- Magicodes.Sms短信库的封装和集成
			简介 Magicodes.Sms是心莱团队封装的短信服务库,已提供Abp模块的封装. Nuget 新的包 名称 说明 Nuget Magicodes.Sms.Aliyun 阿里云短信库 Magicod ... 
- Spring Cloud第六篇 | Hystrix仪表盘监控Hystrix Dashboard
			本文是Spring Cloud专栏的第六篇文章,了解前五篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cloud ... 
- 声明式服务调用Feign
			什么是 Feign Feign 是种声明式.模板化的 HTTP 客户端(仅在 consumer 中使用). 什么是声明式,有什么作用,解决什么问题? 声明式调用就像调用本地方法一样调用远程方法;无 ... 
- [TimLinux] Linux shell获取进程pid
			调用脚本时,获取进程PID: (/this/is/a/script/file.sh > /out/to/log.txt & echo $!) & 脚本内部,获取进程PID: ec ... 
- 笔记||Python3之循环
			循环: 循环概念:在一定条件下,重复做某件事情(代码) while循环:1 - while 条件表达式: 循环体 2 - 当 条件表达式 == True 才执行 ... 
- MySQL 数据查询小练习
			作业 # 创建班级表 create table class ( cls_id int auto_increment primary key, cls_name varchar(10) not null ... 
- 常见排序汇总C&C++
			常见排序主要有以下四种: 1.交换排序 2.选择排序 3.插入排序 4.归并排序 (以下代码基本都有输出每步排序结果) 一.交换排序 交换排序主要是冒泡排序和快排 1.冒泡排序 流程: (1)对数组中 ... 
- centos7—计划任务(at、cron)
			centos7—计划任务(at.cron) 2018-08-08 14:33:17 coisini_覔 阅读数 3751更多 分类专栏: Linux基础 crond/at 版权声明:本文为博主原创 ... 
