数论学习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;
        }
    }
}
相关推荐
滴滴答滴答答38 分钟前
机考刷题之 9 LeetCode 503 下一个更大元素 II
算法·leetcode·职场和发展
飞Link40 分钟前
梯度下降的优化算法中,动量算法和指数加权平均的区别对比
人工智能·深度学习·算法
red_redemption44 分钟前
自由学习记录(130)
学习·soa·aos·ecs已成核心包·shading!=ps
啊哦呃咦唔鱼1 小时前
LeetCode hot100-15 三数之和
数据结构·算法·leetcode
_日拱一卒1 小时前
LeetCode(力扣):杨辉三角||
算法·leetcode·职场和发展
双叶8361 小时前
(Python)Python爬虫入门教程:从零开始学习网页抓取(爬虫教学)(Python教学)
后端·爬虫·python·学习
rqtz1 小时前
基于I2C总线的IMU-磁力计融合算法与数据共享
算法·iic·espidf·qmc5883p·icm42670p·imu磁力计融合
leluckys1 小时前
算法-链表-二、成对交换两个节点
数据结构·算法·链表
小糯米6011 小时前
C++ 排序
c++·算法·排序算法