首页 > 其他分享 >乘法逆元

乘法逆元

时间:2024-06-04 20:23:23浏览次数:12  
标签:const int res long 逆元 乘法 lcm define

对于1~n所有数字的lcm,应该是1~n中所有质数P的 以P为底数对于n的对数 次幂的乘积

即 lcm = ∏ plogpn   。

码题集OJ-跑步 (matiji.net)

线性筛  + 乘法逆元

由题意,1~n每个人最后都重新一起在终点相遇时间停止,那么终止时间则为1~n的所有lcm,

根据上面方法,得到结束的t后,我们再来算每个人在途中会和多少人相遇,我们可以知道每个

人跑的圈数为t / i,,我们把相遇看作成追击问题,他只能追上比自己慢的人,即第i个人,可以

和第 i + 1 ~  n 个人相遇,假设a在追击b,那么他们在t时刻能相遇的次数为t/a - t/b ,那么这些

人追上的次数总和为(n - i) * (t / i) - sum(t / j),j €(i + 1,n),这是他能提供的贡献,对于1~n的所有

人,我们可以帮他的贡献分成两部分,一部分是正贡献,可以追上(i + 1,n)个人,可以被(1,i - 1)

个人追上的负贡献,那么对于第i个人的贡献,他的总贡献为(t / i) * (n - 2 * i + 1),最后累加每个人

的贡献即可求出答案,

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define int long long
 4 #define ll long long
 5 #define endl '\n'
 6 #define all(a) a.begin(), a.end()
 7 #define pb push_back
 8 #define cy cout << "YES" << endl
 9 #define cn cout << "NO" << endl
10 #define x first
11 #define y second
12 #define rep(i, l, r) for (int i = l; i <= r; i++)
13 #define debug(_x) cout << #_x << '=' << _x << endl
14 typedef pair<int, int> PII;
15 const double eps = 1e-8;
16 const double pi = acos(-1);
17 const int mod = 998244353;
18 const int N = 1e7 + 10;
19 
20 bool vis[N];
21 int inv[N];
22 vector<int> primes;
23 
24 void solve()
25 {
26     int n;
27     cin >> n;
28     int lcm = 1;
29     // 求以a为底数b的对数
30     auto mylog = [&](int a, int b)
31     {
32         return floor(log(b) / log(a));
33     };
34     auto qsm = [&](int a, int b)
35     {
36         int res = 1;
37         while (b)
38         {
39             if (b & 1)
40                 res = res * a % mod;
41             a = a * a % mod;
42             b >>= 1;
43         }
44         return res;
45     };
46     inv[1] = 1;
47     int ans = 0;
48     for (int i = 2; i <= n; i++)
49     {                                                  // 线性筛求质数
50         inv[i] = (mod - mod / i) * inv[mod % i] % mod; // 线性逆元
51         if (!vis[i])
52         {
53             primes.pb(i);
54             lcm = lcm * qsm(i, mylog(i, n)) % mod;
55         }
56         for (int p : primes)
57         {
58             if (p * i > n)
59                 break;
60             vis[p * i] = 1;
61             if (i % p == 0)
62                 break;
63         }
64     }
65     for (int i = 1; i <= n; i++)
66     {
67         int cnt = lcm * inv[i] % mod;
68         ans = (ans + cnt * (n - 2 * i + 1) % mod + mod) % mod;
69     }
70     cout << ans % mod << endl;
71 }
72 signed main()
73 {
74     ios::sync_with_stdio(false);
75     cin.tie(nullptr);
76     int _ = 1;
77     // cin >> _;
78 
79     while (_--)
80         solve();
81 
82     return 0;
83 }

 

标签:const,int,res,long,逆元,乘法,lcm,define
From: https://www.cnblogs.com/rw666/p/18231639

相关文章

  • 最小二乘法算法(个人总结版)
    最小二乘法(LeastSquaresMethod)是一种通过最小化误差平方和来拟合数据的回归分析方法。它被广泛应用于线性回归、多元回归以及其他数据拟合问题中。以下是详细的教程,涵盖基本概念、数学推导、具体步骤和实现代码。1.最小二乘法基本概念最小二乘法是一种用于数据拟合的统计......
  • 深度学习--向量,矩阵常见的乘法运算--82
    目录1.向量的数乘2.向量的内积--也叫做点乘3.向量的外积--也叫向量积、叉乘、叉积4.矩阵的数乘5.矩阵的乘法(matmulproduct)6.矩阵的哈达玛积(hadamardproduct):两个相乘的矩阵维度一致,逐元素相乘(也叫矩阵点乘,element-wiseproduct,entrywiseproduct)7卷积1.向量的数......
  • Java运算符 二进制计算 素数问题 九九乘法表 月份问题 分解质因数 完全数问题 天数计
    1.代码观察inta=6--;System.out.println(a);在Java中,后置递减运算符--只能在整型(int)和长整型(long)变量上使用,而且必须将--放在变量值的后面。因此,6--是非法的,Java编译器会报错。正确代码如下inta=6;a--;System.out.println(a);输出结果为52.代码分析Syst......
  • 高精度*高精度乘法
    #include<bits/stdc++.h>usingnamespacestd;vector<int>z(vector<int>x,vector<int>y){ intsum=0; vector<int>s(x.size()+y.size()+10,0); for(inti=0;i<x.size();i++){ for(intj=0;j<y.size();j++){ s[i+j]+=x[i]*......
  • 算法导论,矩阵链乘法(动态规划)
    直入主题,5.27学的矩阵链相乘(动态规划)题目理解:        1.原题                要求:对A1,A2,A3......An进行矩阵的乘法(线性代数的基础知识),求通过添加括号,以达到的最小乘法次数    2.题目理解        乘法:由于矩阵乘法的结合......
  • EBU4201 Introductory Java Programming 2023/24Mini Project(⼉童练习乘法表 下个文
    Task1[25marks]SuperHeroTTisasimpleGraphicalUserInterface(GUI)applicationforchildrenwheretheycanpractisetheirtimestables(seeFigure1).Whenlaunched,yourappshouldlooklikeFigure1-FirstlaunchofSuperHeroTT.Thedrop-downbo......
  • OpenCV算法解析 - 最小二乘法&RANSAC思想
    OpenCVOpenCV是一个开源的计算机视觉库,可以从http://opencv.org获取。OpenCV库用C语言和C++语言编写,可以在Windows、Linux、MacOSX等系统运行。同时也在积极开发Python、Java、Matlab以及其他一些语言的接口,将库导入安卓和iOS中为移动设备开发应用。OpenCV设......
  • 最小二乘法-超详细推导(转换为矩阵乘法推导,矩阵求导推导)
    最小二乘法就是让均方误差最小。下面是损失函数转换为矩阵方式的详解如何让其最小,在导数为0的地方取极小值。问:导数为0的地方可能去极大值,也可能是极小值,凭什么说导数为0就是极小值?答:因为使用的是均方误差,他是一个凹函数,导数为0的点即为最小值和极小值。建议学习一下线......
  • 打印9*9乘法表(递归或压缩矩阵)python
    打印9*9表defprint_multiplication_table(row,col):ifrow>10:return#递归结束条件ifcol==row:print()#换行print_multiplication_table(row+1,1)#递归调用下一行else:print(f"{row-1}*{col}={(......
  • 计算机体系结构-Booth乘法
    原理解释电路实现以Radix-4Booth编码为例,Booth乘法的核心是部分积的生成,需要生成\(N/2\)个部分积,每个部分积与\([X]_补\)有关,存在\(-X,-2X,+X,+2X,0\)这五种可能,其中减去\(X_{补}\)的操作可以认为是按位取反的\(X_{补}\)在末尾+1。为了硬件实现方便,可以将末位1操作提取出来,假......