HDU 4610 Cards (合数分解,枚举)
Cards
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 470 Accepted Submission(s): 72
While you select a card, I will check the number assigned to it and see if it satisfies some of the following conditions:
1. the number is a prime number;
2. the amount of its divisors is a prime number;
3. the sum of its divisors is a prime number;
4. the product of all its divisors is a perfect square number. A perfect square number is such a kind of number that it can be written as a square of an integer.
The score you get from this card is equal to the amount of conditions that its number satisfies. The total score you get from the selection of K cards is equal to the sum of scores of each card you select.
After you have selected K cards, I will check if there's any condition that has never been satisfied by any card you select. If there is, I will add some extra scores to you for each unsatisfied condition. To make the game more interesting, this score may be negative.
After this, you will get your final score. Your task is to figure out the score of each card and find some way to maximize your final score.
Note that 1 is not a prime number. In this problem, we consider a number to be a divisor of itself. For example, considering the number 16, it is not a prime. All its divisors are respectively 1, 2, 4, 8 and 16, and thus, it has 5 divisors with a sum of 31 and a product of 1024. Therefore, it satisfies the condition 2, 3 and 4, which deserves 3 points.
Each test case begins with two integers N and K, indicating there are N kinds of cards, and you're required to select K cards among them.
The next N lines describes all the cards. Each of the N lines consists of two integers A and B, which denote that the number written on this kind of card is A, and you can select at most B cards of this kind.
The last line contains 4 integers, where the ith integer indicates the extra score that will be added to the result if the ith condition is not satisfied. The ABSOLUTE value of these four integers will not exceed 40000.
You may assume 0<N≤103,0<K≤104,1≤A≤106,1≤B≤104,T≤40 and the total N of all cases is no more than 20000. In each case there are always enough cards that you're able to select exact K cards among them.
The first line consists of N integers separated by blanks, where the ith integer is the score of the ith card.
The second line contains a single integer, the maximum final scores you can get.
5 3
1 1
2 1
3 1
4 1
5 1
1 2 3 4
11
题目意思很长。
需要解决,判断一个数是不是素数,一个数约数的个数是不是素数,一个数约数的和是不是素数,一个数约数的乘积是不是素数。
一个数是不是素数直接判断的。
约数个数是素数的话,肯定这个数只能有一个素因子,判断这个素因子的指数+1是不是素数就可以了。
约数的和为素数,也必须只含一个素因子p^k.然后求1+p^1+p^2+..+p^k .判断是不是素数。
比较麻烦的是约数的乘积是不是素数的判断。
其实就是每一个素因子的指数为偶数。
之后我是枚举的。貌似正确的枚举方法是把所有点分成16种,2^16枚举的。
我做的时候是枚举2^4,就是判断每一种能不能取,然后从大到小选择。
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <math.h>
using namespace std;
const int MAXN = ;
//素数筛选部分
bool notprime[MAXN];//值为false表示素数,值为true表示非素数
int prime[MAXN+];
void getPrime()
{
memset(notprime,false,sizeof(notprime));
notprime[]=notprime[]=true;
memset(prime,,sizeof(prime));
for(int i=;i<=MAXN;i++)
{
if(!notprime[i])prime[++prime[]]=i;
for(int j=;j<=prime[]&&prime[j]<=MAXN/i;j++)
{
notprime[prime[j]*i]=true;
if(i%prime[j]==) break;
}
}
}
//合数分解
long long factor[][];
int fatCnt;
int getFactors(long long x)
{
fatCnt=;
long long tmp=x;
for(int i=;prime[i]<=tmp/prime[i];i++)
{
factor[fatCnt][]=;
if(tmp%prime[i]==)
{
factor[fatCnt][]=prime[i];
while(tmp%prime[i]==)
{
factor[fatCnt][]++;
tmp/=prime[i];
}
fatCnt++;
}
}
if(tmp!=)
{
factor[fatCnt][]=tmp;
factor[fatCnt++][]=;
}
return fatCnt;
}
struct Node
{
int A,B;
int score;
int s;
}node[];
bool cmp(Node a,Node b)
{
return a.score > b.score;
}
long long pow_m(long long a,long long n)
{
long long ret = ;
long long tmp = a;
while(n)
{
if(n&)ret*=tmp;
tmp*=tmp;
n>>=;
}
return ret;
}
long long sum(long long p,long long n)//求1+p+p^2+p^3+..p^n
{
if(p==)return ;
if(n == )return ;
if(n&)
return (+pow_m(p,n/+))*sum(p,n/);
else return (+pow_m(p,n/+))*sum(p,n/-)+pow_m(p,n/);
}
void check(int index)
{
if(node[index].A == )
{
node[index].score = ;
node[index].s = (<<);
return;
}
getFactors(node[index].A);
node[index].s = ;
//第一个条件(是素数)
if(fatCnt == && factor[][] == )
node[index].s |= (<<);
//第二个条件
if(fatCnt == && notprime[factor[][]+]==false)
node[index].s |= (<<);
//第三个条件
if(fatCnt == && notprime[sum(factor[][],factor[][])]==false)
node[index].s |= (<<);
//第四个条件
bool flag = true;
for(int i = ;i < fatCnt;i++)
{
long long tmp = (factor[i][]+)*factor[i][]/;
for(int j = ;j < fatCnt;j++)
if(i != j)
tmp *= (factor[j][]+);
if(tmp%!=)
{
flag = false;
break;
}
}
if(flag)node[index].s |= (<<);
node[index].score = ;
for(int i = ;i < ;i++)
if(node[index].s &(<<i))
node[index].score++;
} int b[];
int main()
{
//freopen("1011.in","r",stdin);
//freopen("out.txt","w",stdout);
getPrime();
int T;
int N,K;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&N,&K);
for(int i = ;i < N;i++)
{
scanf("%d%d",&node[i].A,&node[i].B);
check(i);
}
for(int i = ;i < N;i++)
{
printf("%d",node[i].score);
if(i < N-)printf(" ");
else printf("\n");
}
for(int i = ;i < ;i++)
scanf("%d",&b[i]);
int ans = -;
sort(node,node+N,cmp);
for(int k = ;k <(<<);k++)
{
int tmp = ;
int temps = ;
int cc = K;
for(int i = ;i < N;i++)
if((node[i].s & k)==)
{
if(cc == )break;
temps |= node[i].s;
tmp += node[i].score*min(cc,node[i].B);
cc -= min(cc,node[i].B);
if(cc == )break;
}
for(int i = ;i < ;i++)
if((temps&(<<i))==)
tmp += b[i];
if(cc!=)continue;
else ans = max(ans,tmp);
}
printf("%d\n",ans);
}
return ;
}
HDU 4610 Cards (合数分解,枚举)的更多相关文章
- hdu 4610 Cards
http://acm.hdu.edu.cn/showproblem.php?pid=4610 先求出每个数的得分情况,分数和得分状态,(1<<4)种状态 按分数从大到小排序 然后每种状态取 ...
- hdu 5317 合数分解+预处理
RGCDQ Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- hdu 4777 树状数组+合数分解
Rabbit Kingdom Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- HDU 4497 GCD and LCM (合数分解)
GCD and LCM Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total ...
- hdu_4497GCD and LCM(合数分解)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4497 GCD and LCM Time Limit: 2000/1000 MS (Java/Other ...
- Perfect Pth Powers pku-1730(筛+合数分解)
题意:x可以表示为bp, 求这个p的最大值,比如 25=52, 64=26, 然后输入x 输出 p 就是一个质因子分解.算法.(表示数据上卡了2个小时.) 合数质因子分解模板. ]; ]; ; ;n ...
- pku1365 Prime Land (数论,合数分解模板)
题意:给你一个个数对a, b 表示ab这样的每个数相乘的一个数n,求n-1的质数因子并且每个指数因子k所对应的次数 h. 先把合数分解模板乖乖放上: ; ans != ; ++i) { ) { num ...
- GCD and LCM HDU - 4497(质因数分解)
Problem Description Given two positive integers G and L, could you tell me how many solutions of (x, ...
- hdu 5428 The Factor 分解质因数
The Factor Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://bestcoder.hdu.edu.cn/contests/contest ...
随机推荐
- 函数lock_rec_get_n_bits
/*********************************************************************//** Gets the number of bits i ...
- WinCE5.0中文模拟器SDK(VS2005)的配置
WinCE5.0中文模拟器SDK的安装过程不细说了,一路默认即可,下面主要介绍如何配置,使其能在VS2005中正常使用. 安装完成后,打开VS2005,点击菜单“工具”——“选项”——“设备工具”—— ...
- Java-利用spring发送邮件
最近项目中需要发送邮件的功能,于是百度一大把例子.但是有很多都是一样的,一点特点都没有.所以决定整理一番. 在spring2.X以后的版本就提供了org.springframework ...
- 实现图片大小的自动控制( 图片大小控制CSS代码)
图片大小控制CSS代码 将以下代码放到你的样式表文件中即可实现图片大小的自动控制. /*图片大小控制CSS By Tekin */img,a img{border:0;margin:0;padding ...
- POJ 2226 Muddy Fields (最小点覆盖集,对比POJ 3041)
题意 给出的是N*M的矩阵,同样是有障碍的格子,要求每次只能消除一行或一列中连续的格子,最少消除多少次可以全部清除. 思路 相当于POJ 3041升级版,不同之处在于这次不能一列一行全部消掉,那些非障 ...
- POJ 2983 Is the Information Reliable? 信息可靠吗 (差分约束,spfa)
题意:有n个站排成一列,针对每个站的位置与距离关系,现有多个约束条件,约束条件分两种:(1)确定的.明确说明站a距离站b多少个单位距离.(2)不确定的.只知道a在b的左边至少1个单位距离. 根据已知 ...
- 【英语】Bingo口语笔记(8) - 爆破音的发音技巧
轻读,有时候甚至是听不到的,就嘴巴碰一下而已.
- hadoop——在命令行下编译并运行map-reduce程序 2
hadoop map-reduce程序的编译需要依赖hadoop的jar包,我尝试javac编译map-reduce时指定-classpath的包路径,但无奈hadoop的jar分布太散乱,根据自己 ...
- Android 图文教学让你彻底理解activity启动模式
我们首先从最简单的开始, standard 这个模式就是默认的模式,我们都知道 当你用这个模式时,每次发送一个intent,都会生成一个新的实例! 我写一个简单的例子: <?xml versio ...
- 【转】Xcode的Architecture参数的意思
iOS的App现在基本都是用llvm在编译,Xcode也提供了各种设置帮助你进行编译参数的设定.里面有一项就是设定编译的体系结构,涉及到的参数包括:Architectures.Valid Archit ...