(Problem 29)Distinct powers
Consider all integer combinations ofabfor 2
a
5 and 2
b
5:
22=4, 23=8, 24=16, 25=32
32=9, 33=27, 34=81, 35=243
42=16, 43=64, 44=256, 45=1024
52=25, 53=125, 54=625, 55=3125
If they are then placed in numerical order, with any repeats removed, we get the following sequence of 15 distinct terms:
4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125
How many distinct terms are in the sequence generated byabfor 2
a
100 and 2
b
100?
题目大意:
考虑 ab 在 2
a
5,2
b
5下的所有整数组合:
22=4, 23=8, 24=16, 25=32
32=9, 33=27, 34=81, 35=243
42=16, 43=64, 44=256, 45=1024
52=25, 53=125, 54=625, 55=3125
如果将这些数字排序,并去除重复的,我们得到如下15个数字的序列:
4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125
ab 在 2
a
100,2
b
100 下生成的序列中有多少个不同的项?
算法设计(方法1):
1、将ab 进行因数分解,以字符串的形式保存,eg. 285 = (4 * 7)5 = (22 * 7)5 = 2^10*7^5
2、用一个结构体数组保存所有的数的因数分解表达式
3、对上述结构体数组排序
4、遍历此数组,找出不相同的项的总数
//(Problem 29)Distinct powers
// Completed on Tue, 19 Nov 2013, 07:28
// Language: C
//
// 版权所有(C)acutus (mail: acutus@126.com)
// 博客地址:http://www.cnblogs.com/acutus/
#include <stdio.h>
#include <string.h> const int prim[] = {, , , , , , , , , , , ,,
, , , , , , , , , , , }; struct node
{
char list[]; }num[]; int cmp(const void *a, const void *b)
{
return strcmp((*(struct node*)a).list, (*(struct node*)b).list);
} char * explain(int a, int b) /*将a^b分解因数*/
{
char s[], ch;
char *p;
p = s;
int t;
for(int i = ; i < ; i++) {
t = ;
while(a % prim[i] == ) {
if(t == ) {
sprintf(p,"%d",prim[i]);
}
a /= prim[i];
t++;
}
if(t > ) {
p = s + strlen(s);
*p++ = '^';
t = t * b;
sprintf(p,"%d",t);
p = s + strlen(s);
if(a != ) {
*p++ = '*';
} else {
break;
}
}
}
return s;
} void solve(void)
{
int i, j, k, sum;
k = ;
for(i = ; i < ; i++) {
for(j = ; j < ; j++) {
strcpy(num[k++].list, explain(i,j));
}
}
qsort(num, , sizeof(num[]),cmp);
sum = ;
for(i = ; i < ; ) {
j = i + ;
if(j >= ) break;
while(strcmp(num[i].list, num[j].list) == ) {
j++;
}
i = j;
sum ++;
}
printf("%d\n",sum);
} int main(void)
{
solve();
return ;
}
算法设计(方法2):
仔细考察数字矩阵的规律,可以发现:
能够发生重复的数字,将他们因数分解以后,得到的指数的底都是相同的,e.g. 16与64……,在2~100中,能够发生重复数字的底只有4、8、16、32、64、9、27、81、25、36、49、81、100,于是可以在底为2的时候就排除掉以4、8、16、32、64为底的重复的数字。
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h> #define N 101
#define M 601 int main(void)
{
int answer = ;
int i, j, k, l;
bool flag[M]; bool use[N] = {false}; for (i = ; i < N; i++)
{
if (!use[i])
{
int t = i; memset(flag, false, sizeof(flag)); for (j = ; j < N; j++)
{
t = t * i;
if (t >= N)
{
break;
}
use[t] = true;
} for (k = ; k < j; k++)
{
for (l = ; l < N; l++)
{
flag[k*l] = true;
}
} for (k = ; k < M; k++)
{
if(flag[k]){
answer++;
} }
}
}
printf("%d\n",answer);
return ;
}
|
Answer:
|
9183 |
(Problem 29)Distinct powers的更多相关文章
- (Problem 47)Distinct primes factors
The first two consecutive numbers to have two distinct prime factors are: 14 = 2 7 15 = 3 5 The fi ...
- (Problem 53)Combinatoric selections
There are exactly ten ways of selecting three from five, 12345: 123, 124, 125, 134, 135, 145, 234, 2 ...
- (Problem 57)Square root convergents
It is possible to show that the square root of two can be expressed as an infinite continued fractio ...
- (Problem 73)Counting fractions in a range
Consider the fraction, n/d, where n and d are positive integers. If nd and HCF(n,d)=1, it is called ...
- (Problem 42)Coded triangle numbers
The nth term of the sequence of triangle numbers is given by, tn = ½n(n+1); so the first ten triangl ...
- (Problem 41)Pandigital prime
We shall say that an n-digit number is pandigital if it makes use of all the digits 1 to n exactly o ...
- (Problem 70)Totient permutation
Euler's Totient function, φ(n) [sometimes called the phi function], is used to determine the number ...
- (Problem 74)Digit factorial chains
The number 145 is well known for the property that the sum of the factorial of its digits is equal t ...
- (Problem 46)Goldbach's other conjecture
It was proposed by Christian Goldbach that every odd composite number can be written as the sum of a ...
随机推荐
- AppStore被拒原因及总结
4.5 - Apps using background location services must provide a reason that clarifies the purpose of th ...
- android 向serverGet和Post请求的两种方式,android向server发送文件,自己组装协议和借助第三方开源
一个适用于Android平台的第三方和apache的非常多东西类似,仅仅是用于Android上 我在项目里用的是这个 https://github.com/loopj/android-async-ht ...
- Hibernate学习之映射关系
一.Hibernate多对一关联映射:就是在“多”的一端加外键,指向“一”的一端. 比如多个学生对应一个班级,多个用户对应一个级别等等,都是多对一关系. 1.“多”端实体加入引用“一”端实体的变量及g ...
- java 多个文件打包zip
/** * 多个文件打包成zip */ public class ZipDemo { private static void create() throws Exception{ String pat ...
- ButterKnife 绑定 RadioGroup
原则上 ButterKnife 是不支持 RadioGroup 的, 可以通过以下方法添加RadioButton的点击事件: @OnClick({ R.id.radio_btn1, R.id.radi ...
- 大概看了一天python request源码。写下python requests库发送 get,post请求大概过程。
python requests库发送请求时,比如get请求,大概过程. 一.发起get请求过程:调用requests.get(url,**kwargs)-->request('get', url ...
- 关于Python的self指向性
Python的self是指向类的实例化对像,而不是类本身,每次调用类的实例化即self指向此实例化对像,如下代码: class Person: def __init__(self,name): sel ...
- python 10min系列之实现增删改查系统
woniu-cmdb 奇技淫巧--写配置文件生成增删改查系统 视频教程 项目主页跪求github给个star, 线上demo,此页面都是一个配置文件自动生成的 详细的文章介绍和实现原理分析会发布在我的 ...
- 开源项目live555学习心得
推荐:伊朗美女找丈夫比找工作难女人婚前一定要看清三件事 × 登录注册 疯狂少男-IT技术的博客 http://blog.sina.com.cn/crazyboyzhaolei [订阅][手机订 ...
- UITextField align left margin
如果我们想让我们的UITextField输入的字体偏移几个像素,我们常常用空格来代替,有时候我们不想用空格的话怎么办? #import <UIKit/UIKit.h> @interface ...