Description
给你三个整数 a,b,pa,b,p,求 ab mod pabmodp。
Input
输入只有一行三个整数,分别代表 a,b,pa,b,p。
Output
输出一行一个字符串 a^b mod p=s
,其中 a,b,pa,b,p 分别为题目给定的值, ss 为运算结果。
Sample 1
Inputcopy | Outputcopy |
---|---|
2 10 9 | 2^10 mod 9=7 |
Hint
样例解释
210=1024210=1024,1024 mod 9=71024mod9=7。
数据规模与约定
对于 100%100% 的数据,保证 0≤a,b<2310≤a,b<231,a+b>0a+b>0,2≤p<2312≤p<23;
ll ksm(ll base, ll power, ll p)
{
ll ans = 1;
while (power > 0)//当幂大于0
{
if (power& 1)//如果幂的最后一项是1
{
ans = (ans*base)%p;//结果
}
base =(base*base)%p;
power >>= 1;//幂右移一位,
}
return ans;
}
int main()
{
ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
stack<char> stc;
ll a, b, p;
cin >> a >> b >> p;
ll ans =ksm(a, b, p);
printf("%lld^%lld mod %lld=%lld", a, b, p, ans);
};
N皇后问题
在N*N的棋盘上放置N个皇后(n<=11)而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放置2个皇后),编程求解所有的摆放方法。
输入
输入:n
输出
每行输出一种方案,每种方案顺序输出皇后所在的列号,每个数占5列。若无方案,则输出no solute!
样例输入 Copy
4
样例输出 Copy
2 4 1 3 3 1 4 2
typedef long long ll;
using namespace std;
const int maxn = 1e6 + 10;
map<string, ll>mapp;
int flag = 0;
int a[12];
int n;
void f(int x)//放置第一个
{
if (x == n + 1)//放置完毕,输出本次放置结果
{
flag = 1;
for (int i = 1; i <= n; i++)
{
printf("%5d", a[i]);
}
printf("\n");
}
//放置第x的数据
for (int i = 1; i <= n; i++)//所有列都不合法,回溯,进入f(n-1),留下的脏数据不用管
{
a[x] = i;//第x行放在第i列上
int hefa = 1;
//判断此次放置是否合法
for (int j = 1; j <= x-1; j++)
{
if (a[j] == a[x]|| abs(x-j)==abs(a[x]-a[j]))//不合法
{
hefa = 0;
break;
}
}
if (hefa)//合法,放下一个
{
f(x + 1);
}
//不合法选当前行的下一列
}
}
int main()
{
cin >> n;
f(1);
if (flag == 0) {
cout << "no solute!";
}
return 0;
}
拆分自然数
任何一个大于1的自然数n(n <= 10),总可以拆分成若干个小于n的自然数之和。
当n=7共14种拆分方法:
7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7=1+1+1+1+3
7=1+1+1+2+2
7=1+1+1+4
7=1+1+2+3
7=1+1+5
7=1+2+2+2
7=1+2+4
7=1+3+3
7=1+6
7=2+2+3
7=2+5
7=3+4
输入
输入自然数n
输出
输出拆分的方案。
样例输入 Copy
7
样例输出 Copy
1+1+1+1+1+1+1 1+1+1+1+1+2 1+1+1+1+3 1+1+1+2+2 1+1+1+4 1+1+2+3 1+1+5 1+2+2+2 1+2+4 1+3+3 1+6 2+2+3 2+5 3+4
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath> // 添加cmath以使用fabs
typedef long long ll;
using namespace std;
const int maxn = 1e6 + 10;
const double EPSILON = 1e-6; // 定义一个小的阈值
int n;
void dfs(int x, int mx,vector<int> ans)
{
if (x == n)
{
if (ans.size() <= 1)//不输出本身
{
return;
}
for (int i = 0; i < (int)(ans.size())-1; i++)//遍历输出数组
{
cout << ans[i] << "+";
}
cout << ans[ans.size() - 1] << "\n";//输出最后一个数
}
for (int i = 1; i <= n; i++)
{
if (x + i > n || i < mx)continue;//必须越放越大,放进i之后必须保证不能大于n
ans.push_back(i);
dfs(x + i, i, ans);
ans.pop_back();
}
}
int main()
{
cin >> n;
dfs(0,0 ,{});
return 0;
}