Consider all integer combinations ofabfor 2a5 and 2b5:

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 2a100 and 2b100?

题目大意:

考虑 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)= 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的更多相关文章

  1. (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 ...

  2. (Problem 53)Combinatoric selections

    There are exactly ten ways of selecting three from five, 12345: 123, 124, 125, 134, 135, 145, 234, 2 ...

  3. (Problem 57)Square root convergents

    It is possible to show that the square root of two can be expressed as an infinite continued fractio ...

  4. (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 ...

  5. (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 ...

  6. (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 ...

  7. (Problem 70)Totient permutation

    Euler's Totient function, φ(n) [sometimes called the phi function], is used to determine the number ...

  8. (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 ...

  9. (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 ...

随机推荐

  1. AppStore被拒原因及总结

    4.5 - Apps using background location services must provide a reason that clarifies the purpose of th ...

  2. android 向serverGet和Post请求的两种方式,android向server发送文件,自己组装协议和借助第三方开源

    一个适用于Android平台的第三方和apache的非常多东西类似,仅仅是用于Android上 我在项目里用的是这个 https://github.com/loopj/android-async-ht ...

  3. Hibernate学习之映射关系

    一.Hibernate多对一关联映射:就是在“多”的一端加外键,指向“一”的一端. 比如多个学生对应一个班级,多个用户对应一个级别等等,都是多对一关系. 1.“多”端实体加入引用“一”端实体的变量及g ...

  4. java 多个文件打包zip

    /** * 多个文件打包成zip */ public class ZipDemo { private static void create() throws Exception{ String pat ...

  5. ButterKnife 绑定 RadioGroup

    原则上 ButterKnife 是不支持 RadioGroup 的, 可以通过以下方法添加RadioButton的点击事件: @OnClick({ R.id.radio_btn1, R.id.radi ...

  6. 大概看了一天python request源码。写下python requests库发送 get,post请求大概过程。

    python requests库发送请求时,比如get请求,大概过程. 一.发起get请求过程:调用requests.get(url,**kwargs)-->request('get', url ...

  7. 关于Python的self指向性

    Python的self是指向类的实例化对像,而不是类本身,每次调用类的实例化即self指向此实例化对像,如下代码: class Person: def __init__(self,name): sel ...

  8. python 10min系列之实现增删改查系统

    woniu-cmdb 奇技淫巧--写配置文件生成增删改查系统 视频教程 项目主页跪求github给个star, 线上demo,此页面都是一个配置文件自动生成的 详细的文章介绍和实现原理分析会发布在我的 ...

  9. 开源项目live555学习心得

      推荐:伊朗美女找丈夫比找工作难女人婚前一定要看清三件事 × 登录注册   疯狂少男-IT技术的博客 http://blog.sina.com.cn/crazyboyzhaolei [订阅][手机订 ...

  10. UITextField align left margin

    如果我们想让我们的UITextField输入的字体偏移几个像素,我们常常用空格来代替,有时候我们不想用空格的话怎么办? #import <UIKit/UIKit.h> @interface ...