当前位置: 首页 > news >正文

浅谈基础数论(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) :ab(mod p)
  • 互质符号 ( ⊥ ): a ⊥ b → g c d ( a , b ) = 1 (\perp) :a \perp b \rightarrow gcd(a,b)=1 ):abgcd(a,b)=1
  • 求和符号( ∑ \sum )
  • 连乘符号( ∏ \prod )
  • 阶乘符号(!): n ! = ∏ i = 1 n ( 0 ! = 1 ) n!=\prod\limits _{i=1}^{n}(0!=1) n!=i=1n(0!=1)

阶乘

a , b ∈ Z a,b \in \mathbb{Z} a,bZ,且存在 q ∈ Z q \in \mathbb{Z} qZ,使得 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,yZ,有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)=p1
  • 对于一个数n,满足 n = p k n=p^k n=pk,那么 ϕ ( n ) = ( p − 1 ) × p k − 1 \phi(n)=(p-1)\times p^{k-1} ϕ(n)=(p1)×pk1
    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,y0ka,ba),kZ
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,aZ有逆元

例题讲解

X-Magic Pair

题面翻译

给一个数对 ( a , b ) (a,b) (a,b) ,每次可以进行操作 ( a , b ) → ( ∣ a − b ∣ , b ) (a,b) \to (|a-b|,b) (a,b)(ab,b) ( a , ∣ a − b ∣ ) (a,|a-b|) (a,ab) 。问最后能否令 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,x1018

题目描述

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) (ab,b) 或状况二: ( a , a − b ) (a,a-b) (a,ab),在下一步,第二种情况就会变成状况三: ( a , b ) (a,b) (a,b) 或状况四: ( a − b , b ) (a-b,b) (ab,b),状况三会退回了初始状况,状况四与状况一相同,所以,题面中的两种操作是等价的,那么,接下来的叙述中,只考虑操作一。

( a , b ) (a,b) (a,b) 操作一之后变为 ( a − b , b ) (a−b,b) (ab,b),如果 a − b > b a-b>b ab>b,则变为 ( a − 2 b , b ) (a-2b,b) (a2b,b) 否则,变为 ( a − b , 2 b − a ) (a−b,2b-a) (ab,2ba)

显然,我们只需要让 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} BABA A ′ B ′ − A B \dfrac{A'}{B'} - \dfrac{A}{B} BABA 的值尽可能小。

输入格式

共一行,包含三个整数 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 1A106,1B106,1L100,BAL

思路

我们尽量让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)...(r1)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 Q10;l,r100

50% 数据满足: Q ≤ 100 ; l , r ≤ 10000 Q\leq100;l,r\leq10000 Q100;l,r10000

70% 数据满足: Q ≤ 1000 ; l , r ≤ 1 0 6 Q\leq1000;l,r\leq10^6 Q1000;l,r106

100%数据满足: Q ≤ 10000 ; 0 < l , r ≤ 1 0 12 Q\leq10000;0<l,r\leq10^{12} Q10000;0<l,r1012 l ≤ r l\leq r lr

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 1T2×105 1 ≤ a , b , c ≤ 10 9 1 \le a, b, c \le {10}^9 1a,b,c109

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 1n 中所有整数在模 p p p 意义下的乘法逆元。

这里 a a a p p p 的乘法逆元定义为 a x ≡ 1 ( m o d p ) ax\equiv1\pmod p ax1(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 1N40000

思路

如果一个位置可以被看见,那么不难证明,它的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 0seedA,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++)

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

jdk 17新特性 sealed 关键字

通俗理解 sealed 关键字就是给对象继承加了权限控制一样&#xff0c;你必须在我的规则范围内才可以继承我的类 使用 permits 关键字控制允许哪些子类继承 子类必须加以下三个关键字&#xff1a; final 最终继承类&#xff08;继承到这个类就不允许再往下继承了&#xff09;n…...

在仪器计量校准中,无尘车间洁净室检测有哪些方法和流程?

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

【跨时代】第四次工业革命彻底来袭!什么是AI+

你有没有一种很割裂的感觉&#xff0c;就是在短视频里&#xff0c;AI已经要改变全世界了 但自己一用&#xff0c;却发现只能和AI聊聊天 画几张图 难道是姿势不对&#xff1f;但具体是哪里不对呢。 作为一个老牌程序员&#xff0c;我前面分享了很多计算机相关内容&#xff0c;总…...

前端性能优化-纲领篇

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

深度学习-----------数值稳定性

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

SpringBoot项目接口可以承受的调用次数

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

抽象代数精解【8】

文章目录 希尔密码矩阵矩阵基本概念行列式基本概念特殊矩阵关于乘法运算构成群 加解密原理密钥加密函数解密函数 Z 26 上的运算&#xff08; Z 256 与此类似&#xff09; Z_{26}上的运算&#xff08;Z_{256}与此类似&#xff09; Z26​上的运算&#xff08;Z256​与此类似&…...

数据结构与算法 - 二叉树

1. 概述 二叉树是这么一种树状结构&#xff1a;每个节点最多有两个孩子&#xff0c;左孩子和右孩子 完全二叉树&#xff1a;是一种二叉树结构&#xff0c;除了最后一层以外&#xff0c;每一层都必须填满&#xff0c;填充时要遵循从左到右 平衡二叉树&#xff1a;是一种二叉树…...

Spring Cloud Gateway如何给一个请求加请求头

在Spring Cloud Gateway中&#xff0c;可以通过编写一个GlobalFilter来给所有请求加请求头&#xff0c;或者通过编写一个SpecificFilter来给特定路径的请求加请求头。 全局过滤器&#xff08;GlobalFilter&#xff09;的实现方式如下&#xff1a; Configuration public class…...

chromedriver版本下载地址汇总chromedriver所有版本下载地址汇总国内源下载

谷歌浏览器版本经常会升级&#xff0c;chromedriver 也得下载匹配的版本 chromedriver 114以前版本下载地址https://registry.npmmirror.com/binary.html?pathchromedriver/ windows版本请访问链接&#xff1a;https://blog.csdn.net/FL1768317420/article/details/139712108 …...

Go语言与Windows系统

1.获取屏幕尺寸 源自&#xff1a;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—面向对象编程高级

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

[BJDCTF2020]Mark loves cat1

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

微信答题小程序产品研发-用户操作流程设计

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

目标检测——YOLOv10: Real-Time End-to-End Object Detection

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

堡垒机简单介绍

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

【星闪开发连载】WS63E 星闪开发板和hi3861开发板的对比

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

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~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;数据结构、LeetCode专栏 &#x1f4da;本系…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...