数论学习1

矩阵快速幂

求矩阵a的k次方:

cpp 复制代码
struct mat{
    ll c[101][101];
    mat(){
        memset(c,0,sizeof(c));
    }
} a, res;

ll n,k;

// 重载运算符,矩阵乘法
mat operator*(mat &x,mat &y){
    mat t;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            for(int k=1;k<=n;k++){
                t.c[i][j]=(t.c[i][j]+x.c[i][k]*y.c[k][j])%MOD;
            }
        }
    }
    return t;
}

void qpow(ll k){
    for(int i=1;i<=n;i++) res.c[i][i]=1; //单位矩阵
    while(k){
        if(k&1) res=res*a;
        a=a*a;
        k>>=1;
    }
}

void solve(){
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>a.c[i][j];
        }
    }
    qpow(k);

    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cout<<res.c[i][j]<<" \n"[j==n];
        }
    }
}

矩阵加速递推

代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ull unsigned long long
#define i128 __int128_t
#define INF -1e18
#define ls(x) x<<1
#define rs(x) x<<1|1
#define pii pair<int,int>
#define lowbit(x) ((x)&-(x))
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define fi first
#define se second
#define endl '\n'
typedef long long ll;
const int N=10001;
const int M=1000000;
const int MOD=1e9+7;
const int maxk=22;

struct mat{
    ll c[3][3];
    mat(){
        memset(c,0,sizeof(c));
    }
}F,A;

mat operator*(mat &a,mat &b){
    mat t;
    for(int i=1;i<=2;i++){
        for(int j=1;j<=2;j++){
            for(int k=1;k<=2;k++){
                t.c[i][j]=(t.c[i][j]+a.c[i][k]*b.c[k][j])%MOD;
            }
        }
    }
    return t;
}

void qpow(int k){
    F.c[1][1]=F.c[1][2]=1;
    A.c[1][1]=A.c[1][2]=A.c[2][1]=1;
    while(k){
        if(k&1) F=F*A;
        A=A*A;
        k>>=1;
    }
}

void solve(){
    int n;
    cin>>n;
    if(n<=2){
        cout<<1<<endl;
        return;
    }
    qpow(n-2);
    cout<<F.c[1][1]<<endl;
}

signed main(){
    IOS;
    int T=1;
    //cin>>T;
    while(T--){
        solve();
    }

    return 0;
}

分解质因数

代码:

cpp 复制代码
int n;
int a[10001]; //质因数的个数

//分解质因数
void op(int x){
    for(int i=2;i*i<=x;i++){
        while(x%i==0){
            a[i]++;
            x/=i;
        }
    }
    if(x>1) a[x]++;
}

void solve(){
    cin>>n;
    for(int i=2;i<=n;i++){
        op(i);
    }
    for(int i=1;i<=n;i++){
        if(a[i]){
            cout<<i<<" "<<a[i]<<endl;
        }
    }
}
相关推荐
我是中国人哦(⊙o⊙)2 小时前
我的寒假作业
人工智能·算法·机器学习
Zik----2 小时前
Leetcode2 —— 链表两数相加
数据结构·c++·leetcode·链表·蓝桥杯
.格子衫.2 小时前
030动态规划之树形DP——算法备赛
算法·动态规划
babe小鑫2 小时前
大专工业大数据应用专业学习数据分析的价值分析
大数据·学习·数据分析
胡萝卜不甜2 小时前
算法宗门--冒泡排序(“懒”到极致的算法)
算法
梦雨羊2 小时前
LitGPT
学习
charliejohn3 小时前
计算机考研 408 数据结构 中缀转后缀
数据结构·考研·算法
lifallen3 小时前
后缀数组 (Suffix Array)
java·数据结构·算法
仰泳的熊猫3 小时前
题目1523:蓝桥杯算法提高VIP-打水问题
数据结构·c++·算法·蓝桥杯