[2021-07-19 内测NOIP] 操作(状压DP),异或(字典树),等级(线段树),矩阵(DP)

[2021-07-19 内测] NOIP

  • 操作
    • description
    • solution
    • code
  • 异或
    • description
    • solution
    • code
  • 等级
    • description
    • solution
    • code
  • 矩阵
    • description
    • solution
    • code

操作

description

有n堆石子,每堆石子都有一定的数量,第i堆石子的数量用Ai表示。

任意两堆石子均可合并,一堆石子也可 以分成两堆非空的石子。

一次合并或一次分裂都算一次操作。

经过若干次操作以后,石子还剩m堆,告诉你m堆石子的数量Bi,问至少经历了几次操作。

Input

多组数据,第一行一个正整数T表示数据组数,对于每组数据:

第一行,首先一个数n,接下来是n个正整数表示A1~An。

第二行,首先一个数m,接下来是m个正整数表示B1~Bm。

保证A数组的和等于B数组的和。

Output

每组数据一个整数,表示至少经历了多少次操作,保证答案在int范围之内。

Example

standard input

1

1 6

3 1 2 3

standard output

2

Note

对于100%的数据,1 ≤ n,m ≤ 10,1 ≤ Ai,Bi ≤ 50,1 ≤ T ≤ 5

solution

法一:搜索加剪枝,上限是O(nn)O(n^n)O(nn),但肯定跑不满
在这里插入图片描述

法二:状压DPDPDP

合并某些AAA中的数,然后再拆成BBB中的某些数

可以把这样的操作看成合并某些AAA中的数和某些BBB中的数,使之和相等即可

显然,最坏的操作上界是A,BA,BA,B都合成只剩一个数,n−1+m−1=n+m−2n-1+m-1=n+m-2n1+m1=n+m2次操作

但是每当有一段AAA的合成数和BBB的一段合成数相同时,A,BA,BA,B就可以不再跟其它的数合并

A,BA,BA,B的操作数都减少111,一共减少了222次总操作数

也就是说,一段和相同,就会减少222次操作,而我们则想要和相同的段数越多越好

可以把BBB中的数取反合在AAA后面,和相同也就变成了求和等于000

fi:f_i:fi: 操作了iii集合的数的最多段数,sumi:sum_i:sumi: 选的iii集合的数的和,如果为000,那么fif_ifi+1+1+1

最后的f(1<<(n+m)−1)f_{(1<<(n+m)-1)}f(1<<(n+m)1)肯定会+1+1+1,但是这个多余贡献是不会减少总操作数的

code

#include <cstdio>
#include <iostream>
using namespace std;
int T, n, m;
int A[25], f[1 << 20], sum[1 << 20];int lowbit( int x ) {return x & ( -x );
}int main() {scanf( "%d", &T );while( T -- ) {scanf( "%d", &n );for( int i = 1;i <= n;i ++ )scanf( "%d", &A[i] );scanf( "%d", &m );for( int i = 1;i <= m;i ++ )scanf( "%d", &A[i + n] ), A[i + n] = - A[i + n];n += m, m = 1 << n, f[0] = 0;for( int i = 1;i < m;i ++ ) {sum[i] = 0, f[i] = 0;for( int j = 1;j <= n;j ++ )if( 1 << j - 1 & i ) {sum[i] = sum[i ^ ( 1 << j - 1 )] + A[j];f[i] = max( f[i ^ ( 1 << j - 1 )] + ( sum[i] == 0 ), f[i] );}}printf( "%d\n", n - 2 - ( f[m - 1] - 1 << 1 ) );}return 0;
}

异或

description

N 个数字,要求选择 M 次,每次从 N 个数中选出两个数(Ai,Aj)(但不能和之前某次选择 相同)

此次选择的得分为 Ai xor Aj。 求最大得分。

Input

第一行包含两个整数 N,M 接下来一行共 N 个整数描述 N 个数字。

Output

输出一个整数,表示最大得分除以 10^9+7 的余数

Example

Standard input

3 2

1 2 3

Standard output

5

Note

对于 100%的测试数据,N≤50000,0≤Ai≤10^9

solution

  • 二分第MMM大的值xxxcheck异或和大于等于xxx的个数

    • 建字典树,每个点记录经过其的个数cntcntcnt

    • 对每个aia_iai进行字典树查找,显然想要大于等于xxx就尽可能异或出现111

      aia_iaijjj位为1(0)1(0)1(0),那么就去字典树nownownow0(1)0(1)0(1)端的点找

      • 如果存在,必定会出现1<<j1<<j1<<j的贡献,加上之前路径上的贡献(记为sumsumsum)
        • 如果已经大于等于xxx,则直接加上该点的cntcntcnt,不用继续往下搜了
        • 如果还不够,sumsumsum累加该位贡献,继续下一位的搜索
      • 如果不存在,那么就只能放弃jjj位的贡献
        • 如果现在的sumsumsum加上假设后面位全为111的贡献和(1<<j)−1(1<<j)-1(1<<j)1都不够,也不用搜了(不可能)
        • 否则,还是继续下一位的搜索
    • 为了卡常不TTT,字典树应只建一次在二分外面,那么就会造成统计大于等于xxx的异或个数时(x,y),(y,x)(x,y),(y,x)(x,y),(y,x)都被计算进入,所以真正的个数应该是要除以222

  • 然后我们就确定了第MMM大的值xxx

    大于等于xxx的个数可能多于MMM个,最后的答案会涉及减去多余个数乘xxx的贡献

    多余个数的值一定是xxx,不然第MMM大就不可能是xxx

    MMM大是xxx,意味着大于等于x+1x+1x+1的异或组合小于MMM

  • 最后就只剩下求值的问题了

    • 枚举aia_iai,边重构字典树边计算答案值和真正的个数,这样就不需要除以222

    • 走法与上面同理

    • 怎么在计算cntcntcnt的同时计算ansansans,在确定不用继续往下搜的情况那里统计即可

      字典树重构时,开一个数组onei:one_i:onei: 经过该点的第iii位为111的个数

      统计时,枚举位jjj,如果位jjj要产生1<<j1<<j1<<j的贡献,显然数要与aia_iaijjj位不同才行

      • aia_iaijjj位为111,则应该为cnt−onejcnt-one_jcntonej的个数
      • aia_iaijjj位为000,则就是onejone_jonej的个数

code

#include <cstdio>
#include <iostream>
using namespace std;
#define mod 1000000007
#define maxn 50005
struct node {int cnt;int son[2], one[30];
}t[maxn * 29];
int n, m, tot, mid;
long long cnt, ans;
int digit[30], a[maxn];void read( int &x ) {x = 0; char s = getchar();while( s < '0' || s > '9' ) s = getchar();while( '0' <= s && s <= '9' ) {x = ( x << 1 ) + ( x << 3 ) + ( s ^ 48 );s = getchar();}
}long long dfs_cnt( int now, int d, int sum, int x ) {if( d < 0 ) return 0;long long num = 0;int k = x >> d & 1;if( t[now].son[k ^ 1] ) {if( sum + ( 1 << d ) >= mid ) num += t[t[now].son[k ^ 1]].cnt;else num += dfs_cnt( t[now].son[k ^ 1], d - 1, sum + ( 1 << d ), x );}if( t[now].son[k] && sum + ( 1 << d ) - 1 >= mid ) num += dfs_cnt( t[now].son[k], d - 1, sum, x );return num;
}long long calc() {long long num = 0;for( int i = 1;i <= n;i ++ )num += dfs_cnt( 0, 29, 0, a[i] );return ( num >> 1 );
}void add( int now, int x ) {for( int i = 29;~ i;i -- ) {int k = ( x >> i & 1 ) ^ 1;if( k ) ans = ( ans + ( 1ll << i ) * t[now].one[i] ) % mod;else ans = ( ans + ( 1ll << i ) * ( t[now].cnt - t[now].one[i] ) ) % mod;}
}long long dfs_sum( int now, int d, int sum, int x ) {if( d < 0 ) return 0;long long num = 0;int k = x >> d & 1;if( t[now].son[k ^ 1] ) {if( sum + ( 1 << d ) >= mid ) add( t[now].son[k ^ 1], x ), num += t[t[now].son[k ^ 1]].cnt;else num += dfs_sum( t[now].son[k ^ 1], d - 1, sum + ( 1 << d ), x );}if( t[now].son[k] && sum + ( 1 << d ) - 1 >= mid ) num += dfs_sum( t[now].son[k], d - 1, sum, x );return num;
}void solve() {for( int i = 0;i <= tot;i ++ )t[i].cnt = t[i].son[0] = t[i].son[1] = 0;tot = 0;for( int i = 1;i <= n;i ++ ) {int len = 0;for( int j = 29;~ j;j -- )if( a[i] >> j & 1 ) digit[++ len] = j;int now = 0;for( int j = 29;~ j;j -- ) {int c = a[i] >> j & 1;if( ! t[now].son[c] ) t[now].son[c] = ++ tot;now = t[now].son[c];t[now].cnt ++;for( int k = 1;k <= len;k ++ )t[now].one[digit[k]] ++;}cnt += dfs_sum( 0, 29, 0, a[i] );}
}int main() {read( n ), read( m );for( int i = 1;i <= n;i ++ ) {read( a[i] );int now = 0;for( int j = 29;~ j;j -- ) {int c = a[i] >> j & 1;if( ! t[now].son[c] ) t[now].son[c] = ++ tot;now = t[now].son[c];t[now].cnt ++;}}int l = 1, r = ( 1 << 30 ) - 1, val = 1;while( l <= r ) {mid = ( l + r ) >> 1;if( calc() >= m ) val = mid, l = mid + 1;else r = mid - 1;}mid = val;solve();printf( "%lld\n", ( ans - 1ll * val * max( 0ll, cnt - m ) % mod + mod ) % mod );return 0;
}

等级

description

数组A中有n个数,下标从1开始。

如果数组中某一段满足其中的所有元素可以组成一个公差为k的等差数 列,则这一段具备k的等级。

需要注意的是,一个数可以算作公差为任意整数的等差数列。

现在有m个操作,分为两类:

1 X Y: 表示X位置的数变成Y

2 L R K: 表示查询[L,R]是否 等级为k。

Input

第一行两个正整数n,m。 第二行n个非负整数Ai。 接下来m行每一行表示一个操作,格式上文已给出。

强制在线:在本题中x,y,l,r都是经过加密的,需要异或你之前输出的Yes的个数来进行解密。

由于输入量较大,建议使用快读。

Output

对于每个操作2,输出一行,”Yes”表示可以达到等级K,”No”表示不可以。

Example

standard input

5 3

1 3 2 5 6

2 1 5 1

1 5 4

2 1 5 1

standard output

No

Yes

Note

对于100%的数据,1 ≤ n,m ≤ 300000,0 ≤ Ai,y ≤ 10^9,1 ≤ l ≤ r ≤ n,1 ≤ x ≤ n,0 ≤ k ≤ 10^9

solution

法一:长达7k7k7k的无脑码农题

  • 线段树维护区间最大值
  • 线段树维护区间最小值
  • 线段树维护区间是否重复——set/map离散化
  • 线段树维护区间差的gcdgcdgcd
  • 如果是等差数列公差为kkk,必然满足
    • 最大值−-最小值=(r−l)∗k=(r-l)*k=(rl)k
    • 区间无重复
    • gcd=kgcd=kgcd=k

在这里插入图片描述

法二:数学真是太强了!

既然是等差数列,则必定满足等差数列的一次方和,二次方和.........高次方和的多个公式

显然可以线段树维护区间的一次方和,二次方和.........

判断是否跟公式一一符合即可

至于能否被卡,显然是次方维护越多就越难被卡掉

窃以为到三次方就唯一确定是否是等差数列了

不过本题只用维护到平方和即可

具体公式推导可详见博主置顶数学公式证明博文,Thanks♪(・ω・)ノ

code

#include <cstdio>
#include <iostream>
using namespace std;
#define inf 0x7f7f7f7f
#define int long long
#define maxn 300005
struct node {int Min, Max, sum1, sum2;
}t[maxn << 2];
int n, m;
int a[maxn];void read( int &x ) {x = 0; char s = getchar();while( s < '0' || s > '9' ) s = getchar();while( '0' <= s && s <= '9' ) {x = ( x << 1 ) + ( x << 3 ) + ( s ^ 48 );s = getchar();}
}void merge( node &t, node x, node y ) {t.Max = max( x.Max, y.Max );t.Min = min( x.Min, y.Min );t.sum1 = x.sum1 + y.sum1;t.sum2 = x.sum2 + y.sum2;
}void build( int num, int l, int r ) {if( l == r ) {t[num].Max = t[num].Min = t[num].sum1 = a[l];t[num].sum2 = a[l] * a[l];return;}int mid = ( l + r ) >> 1;build( num << 1, l, mid );build( num << 1 | 1, mid + 1, r );merge( t[num], t[num << 1], t[num << 1 | 1] );
}void modify( int num, int l, int r, int pos ) {if( l == r ) {t[num].Max = t[num].Min = t[num].sum1 = a[l];t[num].sum2 = a[l] * a[l];return;}int mid = ( l + r ) >> 1;if( pos <= mid ) modify( num << 1, l, mid, pos );else modify( num << 1 | 1, mid + 1, r, pos );merge( t[num], t[num << 1], t[num << 1 | 1] );
}node query( int num, int l, int r, int L, int R ) {if( L <= l && r <= R ) return t[num];int mid = ( l + r ) >> 1;node ans = { inf, -inf, 0, 0 };if( L <= mid ) merge( ans, ans, query( num << 1, l, mid, L, R ) );if( mid < R ) merge( ans, ans, query( num << 1 | 1, mid + 1, r, L, R ) );return ans;
}signed main() {scanf( "%lld %lld", &n, &m );for( int i = 1;i <= n;i ++ )scanf( "%lld", &a[i] );build( 1, 1, n );int opt, x, y, l, r, k, cnt = 0;while( m -- ) {scanf( "%lld", &opt );if( opt & 1 ) {scanf( "%lld %lld", &x, &y );x ^= cnt, y ^= cnt;if( a[x] == y ) continue;else a[x] = y; modify( 1, 1, n, x );}else {scanf( "%lld %lld %lld", &l, &r, &k );l ^= cnt, r ^= cnt;node MS = query( 1, 1, n, l, r );if( MS.Max - MS.Min != ( r - l ) * k ) {printf( "No\n" );continue;}int N = r - l + 1, a = MS.Min;if( N * a + N * ( N - 1 ) / 2 * k != MS.sum1 ) {printf( "No\n" );continue;}if( N * a * a + N * ( N - 1 ) * k * a + ( N - 1 ) * N * ( 2 * N - 1 ) / 6 * k * k != MS.sum2 ) {printf( "No\n" );continue;}cnt ++;printf( "Yes\n" );}}return 0;
}

矩阵

description

有一个n∗nn*nnn的01矩阵,当它每一行、每一列都恰好有两个位置是1的时候,称为配对矩阵

请问从1∗11*111n∗nn*nnn的所有01矩阵中有多少矩阵为配对矩阵。

设 f[i]表示边长为i的配对矩阵的个数,即询问:∑i=1nfi\sum_{i=1}^nf_ii=1nfi

Input

第一行一个正整数n。

Output

一行一个整数表示所求答案模上998244353的值。

Example

standard input

2

standard output

1

样例解释:唯一的矩阵是 n=2,所有位置都是1的矩阵。

Note

对于100%的数据,1 ≤ n ≤ 10^7

solution

法一:王者打表前七个,找规律猜出DPDPDP转移方程
在这里插入图片描述

法二:正常人的推理

转换题意为:

  • 1×n1\times n1×n的序列 →\rightarrow 一共有nnn
  • 一共nnn次操作 →\rightarrow nnn
  • iii次选两个格子进行操作+1→+1\rightarrow+1iii行选择两个111的列位置
  • 每一列111的位置 →\rightarrow 两次顺序操作i,ji,ji,j选择了该位置
  • 最后使得每个格子的数都恰好是222

也就是说,如果第iii次操作选择了j,kj,kj,k意味着第iii行的j,kj,kj,k列为111,第j,kj,kj,k列的其中有个111是在iii

fif_ifi定义不变,gi:g_i:gi: 长度序列为iii已经进行了一次操作(已经有两个位置为111,剩下i−1i-1i1次操作)的方案数

  • fif_ifi的转移

    • fi−2×(i−1)×Ci2f_{i-2}\times(i-1)\times C_i^2fi2×(i1)×Ci2,两次操作都选择同样的两个格子

      • 那么两次操作顺序不会造成影响,是等价的,所以是在iii次操作中任选两次操作Ci2C_i^2Ci2
      • 剩下i−2i-2i2长度的空序列fi−2f_{i-2}fi2
      • 考虑新增行的位置(随便考虑一个位置固定也行)是一定要填的,剩下的有Ci−1i=(i−1)C_{i-1}^i=(i-1)Ci1i=(i1)种选择

      在这里插入图片描述

    • gi−1×Ci−12×Ai2g_{i-1}\times C_{i-1}^2\times A_{i}^2gi1×Ci12×Ai2,两次操作格子不同

      • 剩下i−1i-1i1长度序列且有两个已经为111gi−1g_{i-1}gi1

      • 与固定新增块相连的两个块随便选,Ci−12C_{i-1}^2Ci12

      • iii次操作中选两次操作,操作顺序不同,是不等价的,Ai2A_{i}^2Ai2

        在这里插入图片描述

  • gig_igi的转移

    • fi−2×(i−1)f_{i-2}\times (i-1)fi2×(i1),直接进行一次两个111位置的操作

      • 剩下i−2i-2i2长度的空序列,fi−2f_{i-2}fi2

      • (i−1)(i-1)(i1)次操作中,进行一次操作,Ci−11=i−1C_{i-1}^1=i-1Ci11=i1

        在这里插入图片描述

    • fi−3×(i−2)×Ai−12f_{i-3}\times (i-2)\times A_{i-1}^2fi3×(i2)×Ai12,两个操作额外选的位置相同

      • 剩下i−3i-3i3长度的空序列,fi−3f_{i-3}fi3

      • 额外配对位置选择有(i−2)(i-2)(i2)

      • i−1i-1i1次操作中,两个操作的顺序不同结果不同,Ai−22A_{i-2}^2Ai22

        在这里插入图片描述

    • gi−2×Ai−22×Ai−12g_{i-2}\times A_{i-2}^2\times A_{i-1}^2gi2×Ai22×Ai12,各自选的格子互不相同

      • 剩下i−2i-2i2长度且已有两个格子为111的序列,gi−2g_{i-2}gi2

      • 两个格子选择不同结果不同,与原两个格子的配对顺序也不同,Ai−22A_{i-2}^2Ai22

      • i−2i-2i2次操作中,两个操作的顺序不同结果不同,Ai−22A_{i-2}^2Ai22

        在这里插入图片描述

code

#include <cstdio>
#define int long long
#define maxn 10000005
#define mod 998244353
int f[maxn], g[maxn];
int n, ans;int C( int x ) {return x * ( x - 1 ) / 2 % mod;
}int A( int x ) {return x * ( x - 1 ) % mod;
}signed main() {scanf( "%lld", &n );f[0] = f[2] = g[2] = ans = 1;for( int i = 3;i <= n;i ++ ) {f[i] = ( f[i] + f[i - 2] * ( i - 1 ) % mod * C( i ) ) % mod;f[i] = ( f[i] + g[i - 1] * C( i - 1 ) % mod * A( i ) ) % mod; g[i] = ( g[i] + f[i - 2] * ( i - 1 ) ) % mod;g[i] = ( g[i] + f[i - 3] * ( i - 2 ) % mod * A( i - 1 ) ) % mod;g[i] = ( g[i] + g[i - 2] * A( i - 2 ) % mod * A( i - 1 ) ) % mod;ans = ( ans + f[i] ) % mod;}printf( "%lld\n", ans );return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET和Java之争

这几天连续有多篇文章诋毁.NET&#xff0c;这类文章我十几年前就看得多了&#xff0c;只不过十几年前是C和C之争&#xff0c;C和Java之争。我从来不理这类文章&#xff0c;因为这类口水战并没有什么实际意义。然而接连收到多位粉丝私聊说&#xff0c;主席&#xff0c;你应该写点…

线性代数一之矩阵转向量随机化求解——神奇的矩阵(BZOJ)+向量内积

向量随机化神奇的矩阵descriptionsolutioncode[NOI2013]向量内积descriptionsolutioncode矩阵既可以看成是一张数位表&#xff0c;也可以看成是若干个行向量或者若干个列向量的向量表神奇的矩阵 description solution 暴力做A∗BA*BA∗B会达到n3n^3n3的复杂度&#xff0c;难…

潘淳:国士无双《微软技术俱乐部(苏州)成立大会暨微软技术交流会介绍》附专题视频...

题记&#xff1a;凡我赶不上的&#xff0c;我就在未来等他&#xff0c;随时等待捕捉那个趋势的的到来。2019年立一个FLAG&#xff0c;加入一个成长性组织&#xff0c;一个能让我学习使我成长的平台。2019年你和我都将亲历这个组织的到来&#xff0c;一个属于苏州程序员自己的大…

ASP.NET Core中借助CSRedis实现安全高效的分布式锁

引言最近回头看了看开发的.NET Core 2.1项目的复盘总结&#xff0c;其中在多处用到Redis实现的分布式锁&#xff0c;虽然在OnResultExecuting方法中做了防止死锁的处理&#xff0c;但在某些场景下还是会发生死锁的问题&#xff0c;下面我只展示部分代码&#xff1a;问题&#x…

L Machining Disc Rotors

L Machining Disc Rotors 题意&#xff1a; 圆心为(0,0)半径为R的圆&#xff0c;现在被被n个互不相交的圆切割(圆心和半径会给出)&#xff0c;保证这n个彼此之间不会交叉&#xff0c;保证n个圆中不会有某个包含整个大圆的情况。问切割后大圆剩余部分的直径&#xff08;即两点…

线性代数二之矩阵加速DP——数学作业,Arc of Dream

矩阵加速数学作业descriptionsolutioncodeArc of Dreamdescriptionsolutioncode数学作业 description solution dpdpdp状态转移方程&#xff0c;dpidpi−1∗10lenii(modM)dp_{i}dp_{i-1}*10^{len_i}i\pmod Mdpi​dpi−1​∗10leni​i(modM) nnn巨大&#xff0c;分段矩阵加速 …

Shadow Properties之美(二)【Microsoft Entity Framework Core随笔】

接着上一篇Shadow Properties之美&#xff08;一&#xff09;&#xff0c;我们来继续举一个有点啰嗦的栗子。先看简单需求&#xff1a;某HR系统&#xff0c;需要记录员工资料。需要记录的资料有&#xff1a;员工号&#xff08;规则&#xff1a;分公司所在城市拼音首字母&#x…

线性代数三之状压DP的矩阵加速——Quad Tiling,Bus公交线路

状压与矩阵加速的藕断丝连Quad Tilingdescriptionsolutioncode[Hnoi2010]Bus 公交线路descriptionsolutioncodeQuad Tiling description solution 设dpi,S:dp_{i,S}:dpi,S​: iii列的状态为SSS的方案数&#xff0c;最后答案为dpn,(1<<4)−1dp_{n,(1<<4)-1}dpn,(…

如何在ASP.NET Core程序启动时运行异步任务(2)

原文&#xff1a;Running async tasks on app startup in ASP.NET Core (Part 2)作者&#xff1a;Andrew Lock译者&#xff1a;Lamond Lu在我的上一篇博客中&#xff0c;我介绍了如何在ASP.NET Core应用程序启动时运行一些一次性异步任务。本篇博客将继续讨论上一篇的内容&…

线性代数四之动态DP(广义矩阵加速)——Can you answer these queries III,保卫王国

动态DP——广义矩阵加速SP1716 GSS3 - Can you answer these queries IIIdescriptionsolutioncode[NOIP2018 提高组] 保卫王国descriptionsolutioncode动态DP能矩阵加速要满足外层操作符对内层操作符具有分配率加法对于乘法就具有分配率(ab)*ca*cb*c SP1716 GSS3 - Can you a…

.Net Core跨平台应用研究-HelloArm(串口篇)

引言为了验证采用dotnet core技术开发的物联网设备数据采集接入服务应用是否能在高性价比的linux嵌入式平台运行&#xff0c;针对dotnet core应用程序进行嵌入式linux环境的发布部署运行验证研究。硬件环境硬件系统经过对比筛选&#xff0c;选用了友善之臂出品的NanoPC-T3 Plus…

[数论系列一]C Looooops,跳跳棋,The Luckiest number,CF906D Power Tower,Minimal Power of Prime,仪仗队,LCMSUM

文章目录C Looooopsdescriptionsolutioncode跳跳棋descriptionsolutioncodeThe Luckiest numberdescriptionsolutioncodeCF906D Power TowerdescriptionsolutioncodeMinimal Power of Primedescriptionsolutioncode[SDOI2008]仪仗队descriptionsolutioncodeLCMSUMdescriptionso…

.NET Core使用微软AI认知服务识别文字语言

点击上方蓝字关注“汪宇杰博客”识别一段文字的语言有多种途径&#xff0c;在这个以AI为热点的时代&#xff0c;我们也可以给自己的应用强行加上AI&#xff0c;然后就能加上“智慧”的名字“自主研发成功”后去吹牛逼。今天我带大家来看看如何使用微软智慧云Azure提供的AI认知服…

【NET CORE微服务一条龙应用】第二章 配置中心使用

背景系列目录&#xff1a;【NET CORE微服务一条龙应用】开始篇与目录在分布式或者微服务系统里&#xff0c;通过配置文件来管理配置内容&#xff0c;是一件比较令人痛苦的事情&#xff0c;再谨慎也有湿鞋的时候&#xff0c;这就是在项目架构发展的过程中&#xff0c;配置中心存…

D - ABC Conjecture Gym - 102798D

D - ABC Conjecture Gym - 102798D 题意&#xff1a; 规定rad(n)n的所有质因子的乘积 给你一个c&#xff0c;问能否构造a和b使得abc且rad(abc)<c 题解&#xff1a; 先说结论&#xff0c;如果c可以拆分出两个一样的质因子&#xff0c;则能构造a和b 即 np1a1 * p2a2 . . .…

“幕后英雄”之Backing Fields【Microsoft Entity Framework Core随笔】

刘德华 有一首歌叫《马桶》&#xff0c;其中有一句歌词是&#xff1a;每一个马桶都是英雄。EFCore也有一个英雄&#xff0c;在幕后默默地任劳任怨。它就叫 "支持字段" (Backing Fields):中文版&#xff1a;https://docs.microsoft.com/zh-cn/ef/core/modeling/backin…

数论练习二之BSGS算法——随机数生成器,Matrix,Lunar New Year and a Recursive Sequence,Fermat‘s Last Theorem

[SDOI2013] 随机数生成器 description solution 肯定是非常想找一个通项公式来表示第nnn个数的 依据形式&#xff0c;考虑化成等比数列 xi1ka(xik)a⋅xibt⇒kba−1x_{i1}ka(x_ik)ax_ibt\Rightarrow k\frac{b}{a-1}xi1​ka(xi​k)a⋅xi​bt⇒ka−1b​ ⇒xiba−1ai−1(x1ba−…

NetCore下模拟和使用Modbus工业通信协议

Tips&#xff1a;1、目前NetCore下与Modbus通信的框架主要选择了 Modbus.Net https://github.com/parallelbgls/Modbus.Net2、modbus是常用的工业通信协议&#xff0c;在软件调试时可以通过modbus pollslave模拟通信通过达到调试目的&#xff0c;下图是我使用软件1&#xff09…

C - Rencontre Gym - 102798C

C - Rencontre Gym - 102798C 参考题解&#xff1a; 参考一 参考二 题意&#xff1a; 有一棵树&#xff0c;树上的点分为三种&#xff0c;&#xff08;一个点可以为多种&#xff09;&#xff0c;现在分别在三种点中随机选一点a&#xff0c;b&#xff0c;c&#xff0c;然后找到…

API标准化成为技术团队面临的最大挑战

调查表明&#xff0c;API 标准化成为了技术团队面临的最大挑战。SmartBear 发布了 2019 年 API 状态报告“The State of API 2019”&#xff0c;此报告旨在为 API 行业建立关于软件团队在 2019 年规划、设计、开发、测试、记录和监控 API 的方法、实践和工具的基准。此次调查有…