用c++写一个 给定整数x和n求x的幂函数 mod 1003
时间: 2024-05-06 12:21:17 浏览: 128
好的,我可以帮您解答这个问题。
以下是使用 C 语言编写求 x 的 n 次方函数 mod 1003 的代码:
```c
#include <stdio.h>
int pow_mod(int x, int n, int mod) {
int res = 1;
while(n > 0) {
if(n % 2 == 1) {
res = (res * x) % mod;
}
x = (x * x) % mod;
n /= 2;
}
return res;
}
int main() {
int x = 2;
int n = 10;
int mod = 1003;
int result = pow_mod(x, n, mod);
printf("%d\n", result);
return 0;
}
```
上述代码中,pow_mod 函数通过快速幂算法求解 x 的 n 次方,将结果对 mod 取模后返回。在 main 函数中,我们设定 x=2,n=10,mod=1003,然后调用 pow_mod 函数得到最终结果并输出。你可以根据需要修改 x、n、mod 的值,或者修改 main 函数调用方式来获取不同的计算结果。
相关问题
用c++和AKS 算法写一个判断素数的函数
AKS算法是一种判断素数的算法,它的时间复杂度是多项式级别的,比传统的素数判定算法要快很多。下面是用C++实现AKS算法判断素数的代码:
```c++
#include <iostream>
#include <cmath>
using namespace std;
// 模幂运算
long long fastPow(long long a, long long b, long long mod) {
long long res = 1;
while (b > 0) {
if (b & 1) {
res = (res * a) % mod;
}
a = (a * a) % mod;
b >>= 1;
}
return res;
}
// 判断是否是素数
bool isPrime(long long n) {
if (n <= 1) {
return false;
}
// 寻找r
long long r = 2;
while (r <= sqrt(n) && n % r != 0) {
r++;
}
if (r <= sqrt(n)) {
return false;
}
// 判断是否满足AKS条件
for (long long a = 2; a <= sqrt(n); a++) {
if (fastPow(a, n, n+1) != (a % (n+1))) {
return false;
}
}
return true;
}
int main() {
long long n;
cout << "请输入一个正整数:" << endl;
cin >> n;
if (isPrime(n)) {
cout << n << "是素数" << endl;
} else {
cout << n << "不是素数" << endl;
}
return 0;
}
```
在这个代码中,我们使用了模幂运算和AKS算法来判断给定的数n是否是素数。模幂运算用来计算a^n mod m,AKS算法则是一个基于多项式的算法,它的核心思想是利用多项式同余来判断一个数是否是素数。
首先,我们先找到一个r,使得r是n的最小质因子。然后,我们判断是否满足以下条件:
1. n=ak,其中k≥2
2. 对于所有1≤a<r,a与n互质或a^n ≡ a (mod n)
3. r>n^(1/2)
如果这些条件都满足,那么n就是素数。
题目描述 月月要参加学校的信息学集训,晚上不能陪华华聊天了。不过为了防止华华去和别的小姐姐聊天,浪费时间影响学习,所以月月给华华布置了一项任务。月月给了华华一个类似斐波那契数列的东西,这个数列满足: F_1=A,F_2=B,F_i=F_{i-1}+F_{i-2}(i>2)F 1 =A,F 2 =B,F i =F i−1 +F i−2 (i>2) 月月希望华华求出\gcd(F_N,F_{N+1})gcd(F N ,F N+1 )。月月认为,求这个东西需要很长的时间,所以华华就没有机会去和其他小姐姐聊天了。华华自然对月月十分忠诚,选择求出F的每一位后计算答案。但是比赛中的你看到这一题,就没必要那么老实了。现在给定A、B、N,请你求出月月要求的那个数字。答案可能很大,但是不取模。 输入描述: 输入一行三个正整数A,B,N。 输出描述: 输出一行一个正整数表示答案。 示例1 输入 2 4 5 输出 2用c++给我做
好的,这是一个比较简单的数学题,可以用矩阵快速幂求解。以下是 C++ 代码实现:
```c++
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int MAXN = 2;
const int MOD = 1e9 + 7;
struct Matrix {
LL m[MAXN][MAXN];
Matrix() { memset(m, 0, sizeof(m)); }
Matrix operator * (const Matrix& b) const {
Matrix c;
for (int i = 0; i < MAXN; ++i) {
for (int j = 0; j < MAXN; ++j) {
for (int k = 0; k < MAXN; ++k) {
c.m[i][j] = (c.m[i][j] + m[i][k] * b.m[k][j]) % MOD;
}
}
}
return c;
}
} base, res;
Matrix qpow(Matrix a, int b) {
Matrix ans;
for (int i = 0; i < MAXN; ++i) {
ans.m[i][i] = 1;
}
while (b) {
if (b & 1) {
ans = ans * a;
}
a = a * a;
b >>= 1;
}
return ans;
}
LL gcd(LL a, LL b) {
return b == 0 ? a : gcd(b, a % b);
}
int main() {
LL a, b, n;
cin >> a >> b >> n;
if (n == 1) {
cout << a << endl;
} else if (n == 2) {
cout << b << endl;
} else {
base.m[0][0] = base.m[0][1] = base.m[1][0] = 1;
res = qpow(base, n - 2);
LL ans = gcd(a * res.m[0][0] % MOD + b * res.m[1][0] % MOD, b * res.m[1][0] % MOD + b * res.m[1][1] % MOD);
cout << ans << endl;
}
return 0;
}
```
在这段代码中,我们定义了一个 `Matrix` 结构体,它表示一个 $2\times2$ 的矩阵。其中重载了 `*` 运算符,实现了矩阵乘法。
然后,我们定义了一个矩阵快速幂函数 `qpow`,用于求解矩阵的 $n$ 次方。
最后,在 `main` 函数中,我们通过快速幂求出矩阵 $base$ 的 $n-2$ 次方,然后根据题目要求求出 $\gcd(F_N, F_{N+1})$ 并输出即可。
需要注意的是,当 $n=1$ 或 $n=2$ 时,直接输出 $a$ 或 $b$ 即可。
阅读全文