2024_7_15~暑期40天算法集训_个人笔记(第四周)_未完成版

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

InputcopyOutputcopy
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;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值