备孕百度之星-9月20日

签到题

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<bitset>

using namespace std;
typedef long long ll;
const ll mod = 998244353;
struct FastIO//输入挂
{
    static const int S=200;
    int wpos;
    char wbuf[S];
    FastIO():wpos(0){}
    inline int xchar()
    {
        static char buf[S];
        static int len=0,pos=0;
        if(pos==len) pos=0,len=fread(buf,1,S,stdin);
        if(pos==len) exit(0);
        return buf[pos++];
    }
    inline int read()
    {
        int s=1,c=xchar(),x=0;
        while(c<=32) c=xchar();
        if(c=='-') s=-1,c=xchar();
        for(;'0'<=c&&c<='9';c=xchar()) x=x*10+c-'0';
        return x*s;
    }
    ~FastIO()
    {
        if(wpos) fwrite(wbuf,1,wpos,stdout),wpos=0;
    }
}io;


inline ll read(){
    ll x=0;char ch;bool f=true;
    for(ch=getchar();!isdigit(ch);ch=getchar())if(ch=='-')f^=f;
    for(;isdigit(ch);ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
    return x;
}
ll qp(ll a){
	ll x = 2;
	ll res = 1;
	while(a != 0){
		if(a % 2 == 1) res = (res * x) % mod;
		x = (x * x) % mod;
		a /= 2;
	}
	return res;
}
int main(){
	int T;
	T = read();
	while(T-- > 0){
		int a1, b1, k;
		a1 = read();
		b1 = read();
		k = read();
		ll m = k / 2;
		ll q = qp(m);
		ll a = a1 * q % mod;
		ll b = b1 * q % mod;
		if(k % 2 == 1){
			ll n_a = (a + b) % mod;
			b = (a - b) % mod; 	
			a = n_a; 
			if(b1 > 0) {
				b = (b + mod) % mod;
			}else{
				b = (b - mod) % mod; 
			}
		}
		cout << a << " " << b << endl;
	} 
}


Hamilton路径(acwing 93)

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;
int dis[25][25];

int main(){
	int n;
	cin >> n;
	for(int i = 0; i < n; i++)
		for(int j = 0; j < n; j++)
			cin >> dis[i][j];
	int dp[1<<n][n];
	for(int i = 0; i < (1<<n); i++)
		memset(dp[i], 0x3f, sizeof(dp[i]));
	dp[1][0] = 0;
	for(int i = 1; i < (1 << n); i++){
		for(int j = 0; j < n; j++){
			if(i >> j & 1)
				for(int k = 0; k < n; k++){//i ^ 1 << j防止从一个点跳到自己 
					if((i ^ 1 << j) >> k & 1) dp[i][j] = min(dp[i][j], dp[i ^ 1 << j][k] + dis[k][j]);//k是中间点 
				}
		}
	}
	cout << dp[(1<<n) - 1][n-1];
}
 

汉诺塔(acwing96)

#include<iostream>
#include<cstring>
#include<bits/stdc++.h>
 
using namespace std;

int n;
int order[21];
bool ch[21];

void calc(int k)
{
	if(k == n + 1){
		for(int i = 1; i <= n; i++) cout << order[i] << " ";
		cout << endl;
		return ;
	}
	for(int i = 1; i <= n; i++){
		if(ch[i]) continue;
		ch[i] = true;
		order[k] = i;
		calc(k+1);
		ch[i] = false;
	}
}
int solve(){
	int d[n+1];
	memset(d, 0x3f, sizeof(d));
	d[1] = 1;
	for(int i = 2; i <= n; i++) d[i] = 2 * d[i-1] + 1;
	int f[n+1];
	memset(f, 0x3f, sizeof(f));
	f[1] = 1;
	for(int i = 2; i <= n; i++){
		for(int j = 1; j < i; j++){
			f[i] = min(f[i], 2 * f[j] + d[i-j]);
		}
	} 
	for(int i = 1; i <= 12; i++)
	cout << f[i] << endl;
}
int main()
{	
	n = 13;
	solve();
	
}



分形之城(awcing98)

这种题一定要静下心思考,多写多画

#include<iostream>
#include<cstring>
#include<bits/stdc++.h>
 
using namespace std;

typedef long long ll;

pair<ll, ll> calc(ll n, ll m){
	if(n == 0) return make_pair(0, 0);
	ll cnt = 1LL << (2*n - 2);//子城房子个数
	ll len = 1LL << (n-1);
	pair<ll, ll> pos = calc(n-1, m % cnt);
	ll z = m / cnt;
	ll x = pos.first, y = pos.second;
	if(z == 0) return make_pair(y, x);
	if(z == 1) return make_pair(x, y + len);
	if(z == 2) return make_pair(x + len, y + len);
	if(z == 3) return make_pair( 2 * len - 1 - y, len - 1 - x); 
}

int main()
{	
	int T;
	cin >> T;
	ll n, a, b;
	while(T-- > 0){
		cin >> n >> a >> b;
		pair<ll, ll> x = calc(n, a-1);
		pair<ll, ll> y = calc(n, b-1);
		double z = sqrt( (x.first - y.first) * (x.first - y.first) + (x.second - y.second) * (x.second - y.second) ) * 10;
		printf("%0.lf\n", z);//lf不保留小数,1f保留一位 
	}
}

欧拉降幂(力扣372)

快速幂

class Solution {
public:
    int mod = 1337;
    int pow(int a, int b){
        int res = 1;
        while(b != 0){
            if(b % 2 == 1) res = (res * a) % mod;
            a = a * a % mod;
            b /= 2;
        }
        return res;
    }
    int superPow(int a, vector<int>& b) {
        a %= mod;
        int res = 1;
        for(int i = 0; i < b.size(); i++){
            res = pow(res, 10) % mod;
            res = res * pow(a, b[i]) % mod;
        }
        return res;
    }
};

欧拉降幂

class Solution {
public:
    //欧拉函数
    int Phi(int n){
        int result = n;
        for( int i = 2; i * i <= n; ++i )
            if( n % i == 0 ){
                do	n /= i;
                while( n % i == 0 );
                result -= result / i;
            }
        if( n > 1 ) result -= result / n;
        return result;
    }
    int MOD = 1337;
    int M_PHI = Phi(MOD);
    //a ^ b降幂
    int superPow(int a, vector<int>& b) {
        a %= MOD;
		int bphi{};
		for( auto i : b )
			bphi = ( bphi * 10 + i ) % M_PHI;
		if( std::gcd( a, MOD ) != 1 && ge( b, M_PHI ) )
			bphi += M_PHI;
		return qp( a, bphi );
    }
    
    // 判断数组形式的十进制数(个位在最后)是否大于等于给定的值
	bool ge( const vector< int > &v, int val )	const noexcept
	{
		int dec{}, p10 = 1;
		for( int i = v.size() - 1; i >= 0; --i, p10 *= 10 )
			if( dec += v[ i ] * p10; dec >= val )
				return true;
		return false;
	}
    //快速幂
	int qp( int base, int exp )	{
		base %= MOD;
		int ans = 1;
		while( exp ){
			if(exp & 1)ans = ans * base % MOD;
			base = base * base % MOD;
			exp >>= 1;
		}
		return ans;
	}
};

快速幂求逆元

d 的逆元相当于 pow(d,mod-2) 。咱就是说,不知其然,也不知其所以然

#include <iostream>
#include <algorithm>

using namespace std;

typedef long long LL;


LL qmi(int a, int b, int p)
{
    LL res = 1;
    while (b)
    {
        if (b & 1) res = res * a % p;
        a = a * (LL)a % p;
        b >>= 1;
    }
    return res;
}


int main()
{
    int n;
    scanf("%d", &n);
    while (n -- )
    {
        int a, p;
        scanf("%d%d", &a, &p);
        if (a % p == 0) puts("impossible");
        else printf("%lld\n", qmi(a, p - 2, p));
    }

    return 0;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务