整除问题

题目描述:
给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。
输入:
两个整数n(2<=n<=1000),a(2<=a<=1000)
输出:
一个整数.
样例输入:
6 10
样例输出:
1
 
 
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
 
bool mark[1001];
int prime[1001];
int size=0;
void init(){
for (int i=2;i<=1000;i++)
mark[i]=false;
for (int i=2;i<=1000;i++){//输入数据是10^9,这里用100000以下的素数做分解是因为n的大于sqrt(n)的因子只能有一个
if (mark[i])
continue;
prime[size++]=i;
if (i>=100) continue;//没加这句程序就崩溃了,应该是因为i>1000,那么j就越界了
for (int j=i*i;j<=1000;j+=i){
mark[j]=true;
}
}
}
 
int main (){
int n,a;
int ans[30];
int as;
int anscnt[30];
init();
while (cin>>n>>a){
as=0;
for (int i=0;i<size;i++){
if (a%prime[i] == 0){
ans[as]=prime[i];
anscnt[as]=0;
 
while(a%prime[i] == 0){
anscnt[as]++;
a /= prime[i];
}
 
as++;
if (a==1)
break;
}
 
}
 
if (a!=1){
ans[as]=a;
anscnt[as++]=1;
}
 
int k=1000000;
int temp=0;
int tt=0;
for (int i=0;i<as;i++){
temp=0;
for (int j=n;j>1;j--){
int nn=j;
while (nn%ans[i] == 0){
temp++;
nn /= ans[i];
tt=temp/anscnt[i];
if (tt>=k)
break;
}
 
}
if (tt< k)
k=tt;
}
 
cout<<k<<endl;
 
}
return 0;
}
 
这是自己做得,没有按照书上的方法。
思路是先计算a的素因子,个数为x,然后计算每一个素因子在n!中有y个,所有素因子的y/x的最小值即为答案。
由于输入数据是1000,所以输入数据的不同素因子个数最多为6.(2*3*5*7*11*13就已经超过了1000)

转载于:https://www.cnblogs.com/yexiaoqi/p/7225669.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,以下是蓝桥杯斐波那契数列整除问题的C语言代码: ```c #include <stdio.h> int main() { int n; scanf("%d", &n); int fib[100005]; fib[1] = 1; fib[2] = 1; for (int i = 3; i <= n; i++) { fib[i] = (fib[i-1] + fib[i-2]) % 10007; } printf("%d\n", fib[n]); return 0; } ``` 这个程序可以计算斐波那契数列的第n项,并对10007取模。在计算过程中,我们只需要保留每一项对10007取模后的结果,可以节省空间并避免溢出的问题。 ### 回答2: 斐波那契数列是指每个数都是前两个数之和的数列,例如:0、1、1、2、3、5、8、13、21、34、……。 蓝桥杯中的斐波那契数列整除问题给定一个整数n,要计算出斐波那契数列中第一个大于n的数,且这个数可以整除给定的整数m。 要解决这个问题,我们可以使用循环来逐个计算斐波那契数列的数,并判断是否满足条件。具体的C语言代码如下: ```c #include <stdio.h> int main() { int n, m; printf("请输入n和m的值:"); scanf("%d%d", &n, &m); int fib1 = 0; // 斐波那契数列的第一个数 int fib2 = 1; // 斐波那契数列的第二个数 int fib = fib1 + fib2; // 斐波那契数列的当前数 while (fib <= n || fib % m != 0) { fib1 = fib2; fib2 = fib; fib = fib1 + fib2; } printf("第一个大于%d且可以整除%d的斐波那契数是:%d\n", n, m, fib); return 0; } ``` 以上代码中,我们使用三个变量来记录斐波那契数列的前两个数和当前数。使用循环来计算下一个数直到满足条件为止。最后输出结果即为第一个大于n且可以整除m的斐波那契数。 这是一种基本的解决方法,但可能在n和m较大时会执行时间较长。可以使用一些优化技巧,如使用矩阵快速幂的方法来加速计算过程。 ### 回答3: 题目要编写C语言程序,判断一个斐波那契数列中的某个数能否被给定的整数整除。 首先,我们需要了解斐波那契数列的定义,即第n个数是由前两个数相加得到的,其中前两个数分别是0和1。根据这个定义,我们可以使用循环来生成斐波那契数列,直到生成的数大于给定的整数。 接下来,我们遍历生成的斐波那契数列,判断其中的每个数是否能够被给定的整数整除。如果是,则输出该数能被整除,如果不是,则继续遍历下一个数。 以下是一个简单的C语言程序示例: #include <stdio.h> int main() { int n, i, a, b, c, num; printf("请输入给定的整数:"); scanf("%d", &n); a = 0; // 第一个数 b = 1; // 第二个数 c = a + b; // 第三个数 while (c <= n) { if (c % n == 0) { printf("%d 能被 %d 整除\n", c, n); } a = b; b = c; c = a + b; } return 0; } 在上述程序中,我们使用了一个while循环来生成斐波那契数列,并使用if语句判断每个数是否能被给定的整数n整除。如果能整除,则输出结果。 以上是一个用C语言解决蓝桥杯斐波那契数列整除问题的思路和示例代码。需要注意的是,该程序只输出能够被整除的数,如果需要输出整个斐波那契数列,可以在每次循环时增加一个输出语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值