浅谈基础数论(c++)
目录
- 一些常见的符号表示
- 阶乘
- 定理
- 快速幂
- 模板题代码
- 扩展:矩阵快速幂
- 主要作用
- 欧拉函数
- 扩展
- 积性函数
- 欧拉函数求法
- 筛选法求欧拉函数(积性函数)
- 扩展欧几里得
- 裴蜀定理
- 问题
- 分析
- 代码
- 问题
- 分析
- 同余与逆元
- 如何求解逆元
- 扩展欧几里得
- 例题讲解
- X-Magic Pair
- 题面翻译
- 题目描述
- 输入格式
- 输出格式
- 样例 #1
- 样例输入 #1
- 样例输出 #1
- 思路
- AC代码
- [NOIP2014 普及组] 比例简化
- 题目背景
- 题目描述
- 输入格式
- 输出格式
- 样例 #1
- 样例输入 #1
- 样例输出 #1
- 提示
- 思路
- AC代码
- 小凯的数字
- 题目背景
- 题目描述
- 输入格式
- 输出格式
- 样例 #1
- 样例输入 #1
- 样例输出 #1
- 样例 #2
- 样例输入 #2
- 样例输出 #2
- 提示
- AC代码
- 【模板】二元一次不定方程 (exgcd)
- 题目描述
- 输入格式
- 输出格式
- 样例 #1
- 样例输入 #1
- 样例输出 #1
- 提示
- AC代码
- 【模板】模意义下的乘法逆元
- 题目背景
- 题目描述
- 输入格式
- 输出格式
- 样例 #1
- 样例输入 #1
- 样例输出 #1
- 提示
- AC代码
- 注意
- [SDOI2008] 仪仗队
- 题目描述
- 输入格式
- 输出格式
- 样例 #1
- 样例输入 #1
- 样例输出 #1
- 提示
- 思路
- AC代码
- Array
- 题面翻译
- 题目描述
- 输入格式
- 输出格式
- 样例 #1
- 样例输入 #1
- 样例输出 #1
- 样例 #2
- 样例输入 #2
- 样例输出 #2
- 思路
- AC代码
- 测测你的矩阵乘法
- 题目描述
- 输入格式
- 输出格式
- 样例 #1
- 样例输入 #1
- 样例输出 #1
一些常见的符号表示
- 整除 (|):a|b表示b是a的倍数
- 同余符号( m o d mod mod、%、 ≡ ) : a ≡ b ( m o d p ) \equiv ):a\equiv b(mod\ p) ≡):a≡b(mod p)
- 互质符号 ( ⊥ ): a ⊥ b → g c d ( a , b ) = 1 (\perp) :a \perp b \rightarrow gcd(a,b)=1 (⊥):a⊥b→gcd(a,b)=1
- 求和符号( ∑ \sum ∑)
- 连乘符号( ∏ \prod ∏)
- 阶乘符号(!): n ! = ∏ i = 1 n ( 0 ! = 1 ) n!=\prod\limits _{i=1}^{n}(0!=1) n!=i=1∏n(0!=1)
阶乘
a , b ∈ Z a,b \in \mathbb{Z} a,b∈Z,且存在 q ∈ Z q \in \mathbb{Z} q∈Z,使得 b = a × q b=a\times q b=a×q,则称b被a整除,记作a|b,则b是a的倍数,a是b的约数
定理
- a|b且b|c,则a|c
- a|b且b|c,对于任意的 x , y ∈ Z x,y \in \mathbb{Z} x,y∈Z,有a|dx+cy
- a ≠ 0 , b = q a + c a\neq 0,b=qa+c a=0,b=qa+c,则a整除b的充要条件是a整除c
快速幂
如何求 x y x^y%p xy
- 暴力for循环,一边乘法一边取模
- pow(a,b)
- 快速幂
若 y的二进制表示如下: y = 2 p 1 + 2 p 2 … … + 2 p k y=2^{p_1}+2^{p_2}……+2^{p_k} y=2p1+2p2……+2pk
x y = x 2 p 1 + 2 p 2 … … + 2 p k x^y=x^{2^{p_1}+2^{p_2}……+2^{p_k}} xy=x2p1+2p2……+2pk
= x 2 p 1 + x 2 p 2 … … + x 2 p k =x^{2^{p_1}}+x^{2^{p_2}}……+x^{2^{p_k}} =x2p1+x2p2……+x2pk
复杂度可以优化到O(log y)
模板题代码
#include <iostream>
#include <algorithm>using namespace std;typedef long long LL;LL qmi(int a, int b, int p)
{LL res = 1 % p;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, b, p;scanf("%d%d%d", &a, &b, &p);printf("%lld\n", qmi(a, b, p));}return 0;
}
扩展:矩阵快速幂
公式打不动了,粘照片吧
主要作用
优化DP 已达到DDP(动态动态规划)
欧拉函数
定义:欧拉函数 ( ϕ ) (\phi ) (ϕ)为正整数n与序列1,2,3,4,5……n-1,n中互质的数的个数(有逆元的个数)
首先对于质数P讨论欧拉函数:
- 对于质数p, ϕ ( p ) = p − 1 \phi(p)=p-1 ϕ(p)=p−1
- 对于一个数n,满足 n = p k n=p^k n=pk,那么 ϕ ( n ) = ( p − 1 ) × p k − 1 \phi(n)=(p-1)\times p^{k-1} ϕ(n)=(p−1)×pk−1
latex已爆炸
扩展
积性函数
欧拉函数求法
int phi(int x)
{int res = x;for (int i = 2; i <= x / i; i ++ )if (x % i == 0){res = res / i * (i - 1);while (x % i == 0) x /= i;}if (x > 1) res = res / x * (x - 1);return res;
}
筛选法求欧拉函数(积性函数)
#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
int prime[N],cnt,phi[N];
bool st[N];
long long get_eulers(int a){phi[1]=1;for(int i=2;i<=a;i++){if(!st[i]){prime[cnt++]=i;phi[i]=i-1;}for(int j=0;prime[j]<=a/i;j++){st[prime[j]*i]=true;if(i%prime[j]==0){phi[prime[j]*i]=prime[j]*phi[i];break;}phi[prime[j]*i]=(prime[j]-1)*phi[i];}}long long res=0;for(int i=1;i<=a;i++)res+=phi[i];return res;}
int main(){int n;scanf("%d",&n);cout<<get_eulers(n)<<endl;return 0;
}
扩展欧几里得
裴蜀定理
对于两个整数a,b,存在一对整数x,y,满足ax+by=gcd(a,b)
问题
那么,我们如何求解ax+by=gcd(a,b)的任意一组解(x,y)呢?
分析
代码
#include<bits/stdc++.h>
using namespace std;
int exgcd(int a,int b,int &x,int &y){if(!b){x=1,y=0;return a;}int d=exgcd(b,a%b,y,x);y-=a/b*x;return d;
}
问题
若是求ax+by=k的可行解呢?
分析
当且仅当gcd(a,b)|k有解,否则无解
注意:
满足ax+by=gcd(a,b)的(x,y),有很多,假设(x_0,y_0)是其中一组。则所有解为 ( x 0 + k b g c d ( a , b ) , y 0 − k a a , b ) , k ∈ Z (x_0+k \frac{b}{gcd(a,b)},y_0-k\frac{a}{a,b}),k\in \mathbb{Z} (x0+kgcd(a,b)b,y0−ka,ba),k∈Z
ax+by=d,d|(a,b),则整个方程同除以(a,b)即可
同余与逆元
同余加法、减法、乘法的结果与先做运算再取模结果一致
也就是说 ( a × b ) (a\times b) (a×b)%p=(a%p) × \times × (b%p)%p
C++中乘除和取模的优先级同级
需要注意的是,除法并不满足同余,但在很多题目中,由于答案过大常让我们输出答案对一个数取模后的答案,那如果在这种题目中我们遇到除法怎么办?
如何求解逆元
扩展欧几里得
由此可知,逆元存在的条件为gcd(a,m)=1,如果m为质数,则对于任意 0 < a < m , a ∈ Z 0\lt a\lt m,a\in\mathbb{Z} 0<a<m,a∈Z有逆元
例题讲解
X-Magic Pair
题面翻译
给一个数对 ( a , b ) (a,b) (a,b) ,每次可以进行操作 ( a , b ) → ( ∣ a − b ∣ , b ) (a,b) \to (|a-b|,b) (a,b)→(∣a−b∣,b) 或 ( a , ∣ a − b ∣ ) (a,|a-b|) (a,∣a−b∣) 。问最后能否令 a = x a=x a=x 或 b = x b=x b=x 。 a , b , x ≤ 1 0 18 a,b,x \le 10^{18} a,b,x≤1018
题目描述
You are given a pair of integers $ (a, b) $ and an integer $ x $ .
You can change the pair in two different ways:
- set (assign) $ a := |a - b| $ ;
- set (assign) $ b := |a - b| $ ,
where $ |a - b| $ is the absolute difference between $ a $ and $ b $ .The pair $ (a, b) $ is called $ x $ -magic if $ x $ is obtainable either as $ a $ or as $ b $ using only the given operations (i.e. the pair $ (a, b) $ is $ x $ -magic if $ a = x $ or $ b = x $ after some number of operations applied). You can apply the operations any number of times (even zero).
Your task is to find out if the pair $ (a, b) $ is $ x $ -magic or not.
You have to answer $ t $ independent test cases.
输入格式
The first line of the input contains one integer $ t $ ( $ 1 \le t \le 10^4 $ ) — the number of test cases. The next $ t $ lines describe test cases.
The only line of the test case contains three integers $ a $ , $ b $ and $ x $ ( $ 1 \le a, b, x \le 10^{18} $ ).
输出格式
For the $ i $ -th test case, print YES if the corresponding pair $ (a, b) $ is $ x $ -magic and NO otherwise.
样例 #1
样例输入 #1
8
6 9 3
15 38 7
18 8 8
30 30 30
40 50 90
24 28 20
365 216 52
537037812705867558 338887693834423551 3199921013340
样例输出 #1
YES
YES
YES
YES
NO
YES
YES
YES
思路
首先对题面进行一下分析就会发现题面中有两种操作,假设当前两个数是 ( a , b ) ( a > = b ) (a,b)(a>=b) (a,b)(a>=b),则在下一步,会分别变成状况一: ( a − b , b ) (a-b,b) (a−b,b) 或状况二: ( a , a − b ) (a,a-b) (a,a−b),在下一步,第二种情况就会变成状况三: ( a , b ) (a,b) (a,b) 或状况四: ( a − b , b ) (a-b,b) (a−b,b),状况三会退回了初始状况,状况四与状况一相同,所以,题面中的两种操作是等价的,那么,接下来的叙述中,只考虑操作一。
( a , b ) (a,b) (a,b) 操作一之后变为 ( a − b , b ) (a−b,b) (a−b,b),如果 a − b > b a-b>b a−b>b,则变为 ( a − 2 b , b ) (a-2b,b) (a−2b,b) 否则,变为 ( a − b , 2 b − a ) (a−b,2b-a) (a−b,2b−a)。
显然,我们只需要让 a a a 变成 a a%b a,之后交换 a a a 和 b b b 的位置,再继续递归执行即可
AC代码
#include<bits/stdc++.h>
using namespace std;
inline bool dfs(long long a,long long b,long long x){if(a<b)swap(a,b);if(a==x||b==x)return true;if(a<x)return false;if(a==0||b==0)return false;if(x%b==a%b)return true;return dfs(a%b,b,x);
}
int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);long long t;cin>>t;while(t--){long long a,b,x;cin>>a>>b>>x;if(dfs(a,b,x))puts("YES");else puts("NO");}
}
[NOIP2014 普及组] 比例简化
题目背景
NOIP2014 普及组 T2
题目描述
在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果。例如,对某一观点表示支持的有 1498 1498 1498 人,反对的有 902 902 902 人,那么赞同与反对的比例可以简单的记为 1498 : 902 1498:902 1498:902。
不过,如果把调查结果就以这种方式呈现出来,大多数人肯定不会满意。因为这个比例的数值太大,难以一眼看出它们的关系。对于上面这个例子,如果把比例记为 5 : 3 5:3 5:3,虽然与真实结果有一定的误差,但依然能够较为准确地反映调查结果,同时也显得比较直观。
现给出支持人数 A A A,反对人数 B B B,以及一个上限 L L L,请你将 A A A 比 B B B 化简为 A ′ A' A′ 比 B ′ B' B′,要求在 A ′ A' A′ 和 B ′ B' B′ 均不大于 L L L 且 A ′ A' A′ 和 B ′ B' B′ 互质(两个整数的最大公约数是 1 1 1)的前提下, A ′ B ′ ≥ A B \dfrac{A'}{B'} \ge \dfrac{A}{B} B′A′≥BA 且 A ′ B ′ − A B \dfrac{A'}{B'} - \dfrac{A}{B} B′A′−BA 的值尽可能小。
输入格式
共一行,包含三个整数 A , B , L A,B,L A,B,L,每两个整数之间用一个空格隔开,分别表示支持人数、反对人数以及上限。
输出格式
共一行,包含两个整数 A ′ , B ′ A',B' A′,B′,中间用一个空格隔开,表示化简后的比例。
样例 #1
样例输入 #1
1498 902 10
样例输出 #1
5 3
提示
对于 100 % 100\% 100% 的数据, 1 ≤ A ≤ 1 0 6 , 1 ≤ B ≤ 1 0 6 , 1 ≤ L ≤ 100 , A B ≤ L 1 \le A \le 10^6,1 \le B \le 10^6,1 \le L \le 100,\dfrac{A}{B} \le L 1≤A≤106,1≤B≤106,1≤L≤100,BA≤L。
思路
我们尽量让a,b互质,即c=1,接着构造,如果两数不互质就加减,直到互质为止
AC代码
#include<bits/stdc++.h>
using namespace std;
inline int gcd(int x,int y)
{if(y==0) return x;return gcd(y,x%y);
}
int main()
{int i,j,a,b,ansa,ansb,l;cin>>a>>b>>l;ansa=l;ansb=1;for(i=1;i<=l;i++)for(j=1;j<=l;j++)if(gcd(i,j)==1&&i*b>=j*a&&i*ansb<j*ansa){ansa=i;ansb=j;}cout<<ansa<<" "<<ansb<<endl;return 0;
}
小凯的数字
题目背景
NOIP2018 原创模拟题T1
NOIP DAY1 T1 or DAY 2 T1 难度
是否发现与NOIP2017 DAY1 T1 有异曲同工之妙
题目描述
小凯有一天突发奇想,写下了一串数字: l ( l + 1 ) ( l + 2 ) . . . ( r − 1 ) r ‾ \overline{l(l+1)(l+2)...(r-1)r} l(l+1)(l+2)...(r−1)r
例如: l = 2 , r = 5 l=2,r=5 l=2,r=5时,数字为: 2345 2345 2345
l = 8 , r = 12 l=8,r=12 l=8,r=12时数字为: 89101112 89101112 89101112
小凯很喜欢数字 9 9 9,所以他想问你他写下的数字除以 9 9 9 的余数是多少
例如: l = 2 , r = 5 l=2,r=5 l=2,r=5时, 2345 m o d 9 = 5 2345\,\,mod\,\,9 = 5 2345mod9=5
输入格式
输入格式:
第一行为数字 Q Q Q,表示小凯有 Q Q Q 个问题
第 2 2 2 到 Q + 1 Q+1 Q+1 行,每行两个数字 l , r l,r l,r 表示数字范围
输出格式
输出格式:
对于每行的问题输出一行,一个数字,表示小凯问题的回答
样例 #1
样例输入 #1
2
2 5
8 12
样例输出 #1
5
5
样例 #2
样例输入 #2
3
1 999
123 456
13579 24680
样例输出 #2
0
6
0
提示
样例1解释: 2345 m o d 9 = 5 2345\,\,mod\,\,9 = 5 2345mod9=5 89101112 m o d 9 = 5 89101112\,\,mod\,\,9 = 5 89101112mod9=5
30% 数据满足: Q ≤ 10 ; l , r ≤ 100 Q\leq10;l,r\leq100 Q≤10;l,r≤100
50% 数据满足: Q ≤ 100 ; l , r ≤ 10000 Q\leq100;l,r\leq10000 Q≤100;l,r≤10000
70% 数据满足: Q ≤ 1000 ; l , r ≤ 1 0 6 Q\leq1000;l,r\leq10^6 Q≤1000;l,r≤106
100%数据满足: Q ≤ 10000 ; 0 < l , r ≤ 1 0 12 Q\leq10000;0<l,r\leq10^{12} Q≤10000;0<l,r≤1012 且 l ≤ r l\leq r l≤r
AC代码
#include <bits/stdc++.h>
using namespace std;
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;cin>>t;while(t--){long long l,r;cin>>l>>r;long long cnt=(r-l+1)%9;;long long ans=cnt*(l%9)%9+(cnt)*(cnt-1)%9*5%9;cout<<ans%9<<endl;}return 0;
}
【模板】二元一次不定方程 (exgcd)
题目描述
给定不定方程
a x + b y = c ax+by=c ax+by=c
若该方程无整数解,输出 − 1 -1 −1。
若该方程有整数解,且有正整数解,则输出其正整数解的数量,所有正整数解中 x x x 的最小值,所有正整数解中 y y y 的最小值,所有正整数解中 x x x 的最大值,以及所有正整数解中 y y y 的最大值。
若方程有整数解,但没有正整数解,你需要输出所有整数解中 x x x 的最小正整数值, y y y 的最小正整数值。
正整数解即为 x , y x, y x,y 均为正整数的解, 0 \boldsymbol{0} 0 不是正整数。
整数解即为 x , y x,y x,y 均为整数的解。
x x x 的最小正整数值即所有 x x x 为正整数的整数解中 x x x 的最小值, y y y 同理。
输入格式
第一行一个正整数 T T T,代表数据组数。
接下来 T T T 行,每行三个由空格隔开的正整数 a , b , c a, b, c a,b,c。
输出格式
T T T 行。
若该行对应的询问无整数解,一个数字 − 1 -1 −1。
若该行对应的询问有整数解但无正整数解,包含 2 2 2 个由空格隔开的数字,依次代表整数解中, x x x 的最小正整数值, y y y 的最小正整数值。
否则包含 5 5 5 个由空格隔开的数字,依次代表正整数解的数量,正整数解中, x x x 的最小值, y y y 的最小值, x x x 的最大值, y y y 的最大值。
读入输出量较大,注意使用较快的读入输出方式
样例 #1
样例输入 #1
7
2 11 100
3 18 6
192 608 17
19 2 60817
11 45 14
19 19 810
98 76 5432
样例输出 #1
4 6 2 39 8
2 1
-1
1600 1 18 3199 30399
34 3
-1
2 12 7 50 56
提示
【数据范围】
对于 100 % 100\% 100% 的数据, 1 ≤ T ≤ 2 × 10 5 1 \le T \le 2 \times {10}^5 1≤T≤2×105, 1 ≤ a , b , c ≤ 10 9 1 \le a, b, c \le {10}^9 1≤a,b,c≤109。
AC代码
#include<bits/stdc++.h>
using namespace std;
long long gcd(long long n,long long m)
{return (n%m==0)?m:gcd(m,n%m);
}
void exgcd(long long a,long long b,long long &x,long long &y)
{if(!b){x=1;y=0;return;}long long p;exgcd(b,a%b,x,y);p=x;x=y;y=p-(a/b)*y;return;
}
int t;
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>t;while(t--){long long x=0,y=0,a,b,c,g,xin,yin,xax,yax,npa=0,k;cin>>a>>b>>c;g=gcd(a,b);if(c%g!=0)cout<<"-1"<<endl;else{a/=g,b/=g,c/=g;exgcd(a,b,x,y);x*=c,y*=c;xin=x>0&&x%b!=0?x%b:x%b+b;yax=(c-xin*a)/b;yin=y>0&&y%a!=0?y%a:y%a+a;xax=(c-yin*b)/a;if(xax>0)npa=(xax-xin)/b+1;if(!npa)cout<<xin<<" "<<yin<<endl;else cout<<npa<<" "<<xin<<" "<<yin<<" "<<xax<<" "<<yax<<endl;}}return 0;
}
【模板】模意义下的乘法逆元
题目背景
这是一道模板题
题目描述
给定 n , p n,p n,p 求 1 ∼ n 1\sim n 1∼n 中所有整数在模 p p p 意义下的乘法逆元。
这里 a a a 模 p p p 的乘法逆元定义为 a x ≡ 1 ( m o d p ) ax\equiv1\pmod p ax≡1(modp) 的解。
输入格式
一行两个正整数 n , p n,p n,p。
输出格式
输出 n n n 行,第 i i i 行表示 i i i 在模 p p p 下的乘法逆元。
样例 #1
样例输入 #1
10 13
样例输出 #1
1
7
9
10
8
11
2
5
3
4
提示
$ 1 \leq n \leq 3 \times 10 ^ 6 , , ,n < p < 20000528 $。
输入保证 $ p $ 为质数。
AC代码
#include <bits/stdc++.h>
const int N = 3000010;
int n, p;
int inv[N], factinv[N];
int main() {scanf("%d%d", &n, &p);factinv[1] = inv[1] = 1;printf("%d\n", 1);for (int i = 2; i <= n; ++i) {inv[i] = 1ll * (p - p / i) * inv[p % i] % p;printf("%d\n", inv[i]);factinv[i] = 1ll * factinv[i - 1] * inv[i] % p;}return 0;
}
注意
本题的时间限制较小,只能写O(1)的递推算法
[SDOI2008] 仪仗队
题目描述
作为体育委员,C 君负责这次运动会仪仗队的训练。仪仗队是由学生组成的 N × N N \times N N×N 的方阵,为了保证队伍在行进中整齐划一,C 君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。
现在,C 君希望你告诉他队伍整齐时能看到的学生人数。
输入格式
一行,一个正整数 N N N。
输出格式
输出一行一个数,即 C 君应看到的学生人数。
样例 #1
样例输入 #1
4
样例输出 #1
9
提示
对于 100 % 100 \% 100% 的数据, 1 ≤ N ≤ 40000 1 \le N \le 40000 1≤N≤40000。
思路
如果一个位置可以被看见,那么不难证明,它的x,y坐标互质
理由如下,如果x与y不互质,则一定有一个c=gcd(x,y)
且一定存在xx=x/c,yy=y/c
则x,y会被挡住,与假设不符
AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long ll;const int maxn=50000;int vis[maxn];
int prime[maxn];
int phi[maxn];
int sum[maxn];int main()
{phi[1]=1;sum[1]=1;int k=-1;for(int i=2;i<=40000;i++){if(!vis[i]){prime[++k]=i;phi[i]=i-1;}for(int j=0;j<=k&&i*prime[j]<=40000;j++){vis[i*prime[j]]=1;if(i%prime[j]==0){phi[i*prime[j]]=phi[i]*prime[j];break;}phi[i*prime[j]]=phi[i]*phi[prime[j]];}sum[i]=sum[i-1]+phi[i];}int n;scanf("%d",&n);if(n==1)printf("0\n");elseprintf("%d\n",2*sum[n-1]+1);return 0;
}
Array
题面翻译
描述
对于长度为n的数组A,A中只包含从1到n的整数(可重复)。如果A单调不上升或单调不下降,A就可称为美丽的。
找出在长度为n时,有几个美丽的A。
输入
一个整数n,(1<=n<=10^5)
输出
输出长度为n时,有几个美丽的A,由于答案可能非常的大,输出时需要将答案对1000000007取模.
Translated by KethGeorge
题目描述
Chris the Rabbit has been interested in arrays ever since he was a child. At the moment he is researching arrays with the length of $ n $ , containing only integers from $ 1 $ to $ n $ . He is not good at math, that’s why some simple things drive him crazy. For example, yesterday he grew keen on counting how many different beautiful arrays there are. Chris thinks that an array is beautiful if it meets one of the two conditions:
- each elements, starting from the second one, is no more than the preceding one
- each element, starting from the second one, is no less than the preceding one
Having got absolutely mad at himself and at math, Chris came to Stewie and Brian to ask them for help. However, they only laughed at him and said that the answer is too simple and not interesting. Help Chris the Rabbit to find the answer at last.
输入格式
The single line contains an integer $ n $ which is the size of the array ( $ 1<=n<=10^{5} $ ).
输出格式
You must print the answer on a single line. As it can be rather long, you should print it modulo $ 1000000007 $ .
样例 #1
样例输入 #1
2
样例输出 #1
4
样例 #2
样例输入 #2
3
样例输出 #2
17
思路
首先,因为不增和不降是相对称的,所以我们只用从一个角度入手进行计算。
其次,运用隔板法,推出排列组合序列
AC代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+7,N=1e5+233;
int n,ans=1,et[N];
signed main(){cin>>n;et[1]=1;for(int i=2;i<=n;i++)et[i]=(mod-mod/i)*et[mod%i]%mod; for(int i=1;i<=n;i++)ans=ans*et[i]%mod*(n+i)%mod;cout<<((ans-n)%mod+mod)%mod;return 0;
}
测测你的矩阵乘法
题目描述
给定两个大小为均为 512 × 512 512 \times 512 512×512,每个元素均为整数,值域为 $ [0, 1024) $ 矩阵 A , B A, B A,B,定义为
A [ i , j ] = ( ( i o r j ) + j ) x o r s e e d A B [ i , j ] = ( ( i a n d j ) + i ) x o r s e e d B \begin{aligned} A\left[i, j\right] &= \left(\left(i \mathbin{\mathrm{or}} j\right) + j\right) \mathbin{\mathrm{xor}} \mathrm{seed}_A \\ B\left[i, j \right] &= \left( \left(i \mathbin{\mathrm{and}} j \right) + i \right) \mathbin{\mathrm{xor}} \mathrm{seed}_B \end{aligned} A[i,j]B[i,j]=((iorj)+j)xorseedA=((iandj)+i)xorseedB
其中 i , j ∈ [ 0 , 512 ) i, j \in [0, 512) i,j∈[0,512)。
请计算 C = A × B C = A \times B C=A×B。
输入格式
输入为两个整数 s e e d A , s e e d B \mathrm{seed}_A, \mathrm{seed}_B seedA,seedB( 0 ≤ s e e d A , s e e d B < 1024 0 \leq \mathrm{seed}_A, \mathrm{seed}_B < 1024 0≤seedA,seedB<1024)。
你可以使用以下代码模板,完成其中的 multiply
即可。
你可以修改 N N N(即数组长度),但是不能修改 n n n(矩阵大小,恒为 512 512 512)。
#include <bits/stdc++.h>
const int n = 512, N = n;
void multiply (int c[N][N], int a[N][N], int b[N][N]) {// c = a * b
}
int c[N][N], a[N][N], b[N][N];
int main() {int seedA, seedB;scanf("%d%d", &seedA, &seedB);for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)a[i][j] = ((i | j) + j) ^ seedA;for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)b[i][j] = ((i & j) + i) ^ seedB;multiply(c, a, b);for (int i = 0; i < n; i++) {int sum = 0;for (int j = 0; j < n; j++) sum ^= c[i][j];printf("%d\n", sum);}
}
输出格式
输出 512 512 512 行,分别是 C C C 每行的异或和。
输入中的代码会帮助你完成输出。
样例 #1
样例输入 #1
0 0
样例输出 #1
8126464
14942208
33554432
...(省略506行)
29097984
146800640
148570112
题面有点奇怪
#include <bits/stdc++.h>
const int n = 512, N = n;
void multiply (int c[N][N], int a[N][N], int b[N][N]) {for(int i = 0; i < N; i++) {for(int j = 0; j < N; j++) {for(int k = 0; k < N; k++) {c[i][j] += a[i][k] * b[k][j];}}}
}
int c[N][N], a[N][N], b[N][N];
int main() {int seedA, seedB;scanf("%d%d", &seedA, &seedB);for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)a[i][j] = ((i | j) + j) ^ seedA;for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)b[i][j] = ((i & j) + i) ^ seedB;multiply(c, a, b);for (int i = 0; i < n; i++) {int sum = 0;for (int j = 0; j < n; j++) sum ^= c[i][j];printf("%d\n", sum);}return 0;
}
这是我的第十四篇文章,如有纰漏也请各位大佬指正
辛苦创作不易,还望看官点赞收藏打赏,后续还会更新新的内容。
相关文章:

浅谈基础数论(c++)
目录 一些常见的符号表示阶乘定理 快速幂模板题代码扩展:矩阵快速幂主要作用 欧拉函数扩展积性函数 欧拉函数求法筛选法求欧拉函数(积性函数) 扩展欧几里得裴蜀定理问题分析代码 问题分析 同余与逆元如何求解逆元扩展欧几里得 例题讲解X-Magi…...

jdk 17新特性 sealed 关键字
通俗理解 sealed 关键字就是给对象继承加了权限控制一样,你必须在我的规则范围内才可以继承我的类 使用 permits 关键字控制允许哪些子类继承 子类必须加以下三个关键字: final 最终继承类(继承到这个类就不允许再往下继承了)n…...

在仪器计量校准中,无尘车间洁净室检测有哪些方法和流程?
仪器计量校准行业内,无尘车间洁净室检测可以说是较为热门的业务,因为其预算高,且检测流程不是太繁琐,很多仪器计量校准机构也是设立相关实验室,专门处理相关仪器的检测。不过虽然许多机构想要涉足该领域,但…...

【跨时代】第四次工业革命彻底来袭!什么是AI+
你有没有一种很割裂的感觉,就是在短视频里,AI已经要改变全世界了 但自己一用,却发现只能和AI聊聊天 画几张图 难道是姿势不对?但具体是哪里不对呢。 作为一个老牌程序员,我前面分享了很多计算机相关内容,总…...

前端性能优化-纲领篇
前端性能优化 本模块将梳理前端性能优化的相关知识点 从浏览器输入 URL 到页面展示发生了什么 完整版请查看[Browser_网络_安全]的部分,这里只是简单的梳理一下 DNS 解析TCP 连接浏览器发出 HTTP 请求服务器处理请求并返回 HTTP 报文浏览器解析渲染页面 性能优…...

深度学习-----------数值稳定性
目录 神经网络的梯度数值稳定性的常见两个问题例子:MLP 梯度爆炸梯度爆炸的问题 梯度消失梯度消失的问题 总结模型初始化和激活函数让训练更加稳定让每层的方差是一个常数 权重初始化正向均值和方差正向均值正向方差 反向均值和方差Xavier初始正向和反向的均值和方差…...

SpringBoot项目接口可以承受的调用次数
一个Spring Boot接口能够承受的调用次数主要取决于几个因素,包括但不限于: 服务器硬件:CPU、内存、硬盘I/O速度以及网络带宽都会直接影响接口的处理能力和并发量。操作系统和JVM配置:操作系统调度策略、JVM的内存分配、垃圾回收机…...

抽象代数精解【8】
文章目录 希尔密码矩阵矩阵基本概念行列式基本概念特殊矩阵关于乘法运算构成群 加解密原理密钥加密函数解密函数 Z 26 上的运算( Z 256 与此类似) Z_{26}上的运算(Z_{256}与此类似) Z26上的运算(Z256与此类似&…...

数据结构与算法 - 二叉树
1. 概述 二叉树是这么一种树状结构:每个节点最多有两个孩子,左孩子和右孩子 完全二叉树:是一种二叉树结构,除了最后一层以外,每一层都必须填满,填充时要遵循从左到右 平衡二叉树:是一种二叉树…...

Spring Cloud Gateway如何给一个请求加请求头
在Spring Cloud Gateway中,可以通过编写一个GlobalFilter来给所有请求加请求头,或者通过编写一个SpecificFilter来给特定路径的请求加请求头。 全局过滤器(GlobalFilter)的实现方式如下: Configuration public class…...

chromedriver版本下载地址汇总chromedriver所有版本下载地址汇总国内源下载
谷歌浏览器版本经常会升级,chromedriver 也得下载匹配的版本 chromedriver 114以前版本下载地址https://registry.npmmirror.com/binary.html?pathchromedriver/ windows版本请访问链接:https://blog.csdn.net/FL1768317420/article/details/139712108 …...

Go语言与Windows系统
1.获取屏幕尺寸 源自:Golang通过使用GetSystemMetrics获取系统的分辨率 - 完美代码 (perfcode.com) package mainimport ("syscall""fmt" )const (SM_CXSCREEN uintptr(0) // X Size of screenSM_CYSCREEN uintptr(1) // Y Size of screen …...

JAVA—面向对象编程高级
学习了一定基础后,开始更加深入的学习面向对象,包含static,final两个关键字,面向对象编程三大特征之继承和多态。以及对于抽象类,内部类,接口,枚举,泛型的学习。 目录 1.static (…...

[BJDCTF2020]Mark loves cat1
打开题目 发现这么多链接,以为要一点点去找功能上的漏洞。当你源代码,dirsearch,抓包等等操作之后,发现什么都没有。所以这题又是一道源码泄露题,上GItHack。扫描结果如下 http://63f29a80-e08b-43ae-a6d0-8e70fb02ea…...

微信答题小程序产品研发-用户操作流程设计
在答题小程序中,用户流程是指用户从进入小程序开始,到完成答题、查看结果、进行练习等一系列操作的步骤。 这里我画了一张用户流程图,展示用户在小程序中的主要操作流程。以及对每个步骤的详细说明。这里分两种角色,用户和管理员…...

目标检测——YOLOv10: Real-Time End-to-End Object Detection
YOLOv10是在YOLOv8的基础上,借鉴了RT-DETR的一些创新点改进出来的 标题:YOLOv10: Real-Time End-to-End Object Detection论文:https://arxiv.org/pdf/2405.14458源码:https://github.com/THU-MIG/yolov10 1. 论文介绍 在过去的几…...

堡垒机简单介绍
堡垒机(Bastion Host),也被称为跳板机、跳板服务器或堡垒服务器,是一种在网络安全中扮演重要角色的设备或服务。以下是关于堡垒机的详细介绍: 一、定义与功能 堡垒机是一种用于控制和管理网络安全的重要工具…...

【星闪开发连载】WS63E 星闪开发板和hi3861开发板的对比
此次星闪开发者体验官活动使用的开发板都是NearLink_DK_WS63E开发板,它和NearLink_DK_WS63开发板的区别在于具有雷达感知功能。从开发板的照片也可以看到WS63E有一个雷达天线接口。 我们把WS63E开发板和hi3861开发板的功能做了简单的对比,见下表。 参数…...

Python接口自动化测试框架(实战篇)-- Jenkins持续集成
文章目录 一、前言二、[Jenkins](https://www.jenkins.io/)2.1、环境搭建2.2、插件准备2.3、创建job2.4、小结2.5、构建策略2.6、报告展示2.7、扩展三、总结一、前言 温馨提示:在框架需要集成jenkins的时候,一定要注意环境切换问题,如果jenkins和开发环境是同样的系统且都有…...

【leetcode】根据二叉树创建字符串、二叉树的前中后遍历(非递归链表实现二叉树)
Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:数据结构、LeetCode专栏 📚本系…...

【RabbitMQ】RabbitMQ交换机概述
一、交换机的类型 RabbitMQ提供了以下四种主要类型的交换机: 直连交换机(Direct Exchange) 特点:直连交换机是最基本的交换机类型,它根据完全匹配的路由键(Routing Key)将消息路由到绑定的队列…...

ROS2从入门到精通4-6:路径平滑插件开发案例(以B样条曲线平滑为例)
目录 0 专栏介绍1 ROS2路径平滑器介绍2 平滑器插件编写模板2.1 构造平滑器插件类2.2 注册并导出插件2.3 编译与使用插件 3 基于B样条曲线的路径平滑 0 专栏介绍 本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和应用ROS2…...

Tensorflow训练视觉模型(CPU)
目录 零、模型下载 一、清理C盘 二、 配置环境 三、运行项目前提操作 (1)根据自己的项目设置路径。每次激活虚拟环境(tensorflow115)都得重设一次 (2)执行setup 这个项目的路径移动了位置也需要重设一…...

从根儿上学习spring 十 之run方法启动第四段(4)
我们接着上一节已经准备开始分析AbstractAutowireCapableBeanFactory#doCreateBean方法,该方法是spring真正开始创建bean实例并初始化bean的入口方法,属于核心逻辑,所以我们新开一节开始分析。 图12 图12-530到536行 这几行的主要就是创建b…...

如果我的发明有修改,需要如何处理?
如果我的发明有修改,需要如何处理?...

java:File与MultipartFile互转
1 概述 当我们在处理文件上传的功能时,通常会使用MultipartFile对象来表示上传的文件数据。然而,有时候我们可能已经有了一个File对象,而不是MultipartFile对象,需要将File对象转换为MultipartFile对象进行进一步处理。 在Java中…...

高级java每日一道面试题-2024年8月04日-web篇-如果客户端禁止cookie能实现session还能用吗?
如果有遗漏,评论区告诉我进行补充 面试官: 如果客户端禁止cookie能实现session还能用吗? 我回答: 当客户端禁用了Cookie时,传统的基于Cookie的Session机制会受到影响,因为Session ID通常是通过Cookie在客户端和服务器之间传递的。然而,尽…...

leetcode 107.二叉树的层序遍||
1.题目要求: 给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)2.此题步骤: 1.先创建好队列,出队和入队函数: //创建队列 typedef struct que…...

C++在网络安全领域的应用
前言: 在当今的数字化时代,网络安全已经成为一个至关重要的领域。随着网络威胁和攻击手段的不断演变,开发高效、安全的系统和工具变得尤为重要。C作为一种功能强大且高性能的编程语言,在网络安全领域发挥着不可替代的作用。本文简…...

Chapter 26 Python魔术方法
欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能! 文章目录 前言一、什么是魔术方法?二、常见的魔术方法① __init__构造方法② __str__字符串方法③ __lt__比较方法④ __le__比较方法⑤ __eq__比较方法 前言 本章将详细讲…...