![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数论
文章平均质量分 64
幼儿园大哥~
笑口常开,好彩自然来
展开
-
Codeforces 359 C
传送门题目大意给你一个质数和一个序列a1,a2...ana_1,a_2...a_na1,a2...an。计算1xa1+1xa2+...+1xan\frac{1}{x^{a_1}}+\frac{1}{x^{a_2}}+...+\frac{1}{x^{a_n}}xa11+xa21+...+xan1。对和式通分后得到st\frac{s}{t}ts,其中,t=xa1+a2+...+ant=x^{a_1+a_2+...+a_n}t=xa1+a2+...+an,现在,要求你求出sss和t原创 2021-03-18 20:08:34 · 158 阅读 · 1 评论 -
Codeforces 121 C
传送门题目大意问字典序第kkk大的1−n1-n1−n的排列中的只由444和777组成的数且位置上也是由444和777构成的数的个数。思路代码原创 2021-03-12 20:27:37 · 2173 阅读 · 0 评论 -
Codeforces 111 B
传送门题目大意给你nnn次询问,每次给你一个x[i],y[i]x[i],y[i]x[i],y[i]。然后让你输出,x[i]x[i]x[i]这个数中的因子有多少个并没有在这个数的前y[i]y[i]y[i]个数的因子中出现过。思路mapmapmap标记前面出现的因子,mp[x]=imp[x]=imp[x]=i代表xxx这个是在第iii个数出现的,这样就可以将复杂度降下来~。代码int n,x[maxn],y[maxn];int a[maxn][300];map<int,int>mp原创 2021-03-11 20:32:00 · 104 阅读 · 0 评论 -
Codeforces 1081 E
传送门题目大意给定长度为nnn(nnn为偶数)的数列xxx的偶数项,求出数列xxx的奇数项,使得对于任意t∈[1,n],x1+x2+...+xtt∈[1,n],x1+x2+...+xtt∈[1,n],x1+x2+...+xt为平方数,若无解输出NoNoNo,否则先输出一行YesYesYes,再输出x1,x2,x3,...,xnx1,x2,x3,...,xnx1,x2,x3,...,xn,若有多解输出任意一组解。xxx数组奇数项不超过101310^{13}1013,偶数项不超过10510^5105,n&原创 2021-03-09 21:24:38 · 93 阅读 · 0 评论 -
Codeforcrs 1295 D
传送门题目大意给定两个整数 a,m (1≤a<m≤1010)a,m\ (1\le a<m\le 10^{10})a,m (1≤a<m≤1010)。计算满足条件 0≤x<m0 \le x < m0≤x<m且 gcd(a,m)=gcd(a+x,m)\gcd(a,m)=\gcd(a+x,m)gcd(a,m)=gcd(a+x,m)的整数xxx的个数。思路令d=gcd(a,m)d=gcd(a,m)d=gcd(a,m),那么gcd(ad,md)=gcd原创 2021-03-03 17:32:00 · 120 阅读 · 1 评论 -
Codeforces 1401 D
传送门题目大意给定一棵 nnn个节点,n−1n-1n−1 条边的树。你可以在每一条树上的边标上边权,使得:每个边权都为 正整数;这 n−1n-1n−1个边权的乘积等于kkk;边权为 111 的边的数量最少。定义 f(u,v)f(u,v)f(u,v) 表示节点uuu到节点 vvv的简单路径经过的边权总和。你的任务是让∑i=1n−1∑j=i+1nf(i,j)\sum_{i=1}^{n-1}\sum_{j=i+1}^{n}{f(i,j)}∑i=1n−1∑j=i+1nf(i,j)最大。最终答案可能原创 2021-03-03 16:48:59 · 134 阅读 · 1 评论 -
Codeforces 1034 A
传送门题目大意给你nnn个数,去掉尽量少的数使得剩下数的gcdgcdgcd比原来的大,无解输出−1-1−1。思路代码原创 2021-03-02 16:21:13 · 136 阅读 · 0 评论 -
Codeforces 687 B
传送门题目大意c[]c[]c[]是长度为nnn的序列,问lcm(c1,c2...cn)lcm(c_1,c_2...c_n)%klcm(c1,c2...cn)是否为0,是输出YesYesYes,不是输出NoNoNo。思路分解质因数法求出lcmlcmlcm,将kkk分解质因数,只要kkk质因数的幂次都小于等于lcmlcmlcm中的幂次,就是YesYesYes。代码bool vis[maxn];//标记非素数,0是素数int primer[maxn/10];//存素数int cnt=0;//原创 2021-01-13 15:47:05 · 182 阅读 · 1 评论 -
Codeforces 665 D
传送门题目大意给你一个长度为n的序列a,找到最大的子序列,使得子序列内任意两个数的和为素数思路因为j>i,所以可以输出1个数。答案最后分为四种情况:全是1cnt个1,另一个数+1是素数两个数和是素数一个数代码int n;int a[maxn];bool vis[maxn];//标记非素数,0是素数int primer[maxn/10];//存素数int cnt=0;//记录素数个数,void find_primer(){ for(int i=2;i <=原创 2021-01-13 14:49:32 · 164 阅读 · 0 评论 -
LDU----质数
A:轻拍牛头题目大意求一个数能被序列中多少个数整除思路每个数的答案记录在ans[]中计算出序列中每个数出现的次数vis[],从小到大枚举数a[i]的倍数,若是倍数存在,ans[倍数]+=vis[a[i]]代码int a[maxn],vis[maxn];int ans[maxn];int main(){ int n; scanf("%d",&n); int max1=-inf; for(int i=1;i<=n;i++){ scanf("%d",&a[i]原创 2021-01-13 12:52:35 · 160 阅读 · 0 评论 -
Codeforces 1228 C
传送门题目大意思路找质因子的贡献,即n!n!n!有多少个质因子.代码ll x,n;ll ans=1;vector<ll>v; void init(ll tmp){ for(ll i=2;i*i<=tmp;i++){ if(tmp%i==0){ while(tmp%i==0){ tmp/=i; } v.push_back(i); } } if(tmp>1) v.push_back(tmp);} int main(){原创 2021-01-09 21:58:43 · 109 阅读 · 0 评论 -
Codeforces 490 C
传送门题目大意将sss分成两个部分,其中,左边被aaa整除,右边被bbb整除,且不能有前导00≤s≤1010000000\leq s\leq 10^{1000000}0≤s≤101000000,0≤a,b≤1080\leq a,b\leq 10^80≤a,b≤108思路预处理前缀模和后缀模就好代码char s[maxn];ll a,b;ll c[maxn],d[maxn];int main(){ scanf("%s",s+1); scanf("%lld%lld",&a,&a原创 2021-01-07 20:44:17 · 89 阅读 · 0 评论 -
Codeforces 582 A
传送门题目大意有一个长度为nnn的数列aaa,它可以生成一个n2n^2n2的数表,数表的第iii行第jjj列存放的数字是gcd(a[i],a[j])\gcd(a[i],a[j])gcd(a[i],a[j]) 即a[i]a[i]a[i]和a[j]a[j]a[j]的最大公因数。一个例子:举个例子,上面那个表,就是由数列a[]={4,3,6,2}a[]=\{4,3,6,2\}a[]={4,3,6,2}生成的。现在我们要做这样一件事情:将这个数表中的这n2n^2n2个数打乱,得到一个长度为n2n^2n原创 2020-12-24 10:25:21 · 102 阅读 · 0 评论 -
Codeforces 66 D
传送门题目大意构造一个长度为n的序列使其满足下列条件:任意两数的最大公约数不等于1所有数的最大公约数等于1任意两数互不相同若有多组解,输出任意一组。若无解,输出-1。 输出的数长度不能超过100位。思路...原创 2020-12-17 17:25:45 · 139 阅读 · 0 评论 -
Codeforces 546 D
传送门题目大意给你a,b(1≤b≤a≤5∗106)a,b(1\leq b\leq a\leq 5*10^6)a,b(1≤b≤a≤5∗106)表示a!/b!a!/b!a!/b!表示的数,你每次可以对这个数除以xxx(x>1x>1x>1,且xxx为这个数的因子)使它变成a!/b!/xa!/b!/xa!/b!/x,问你最多可以操作多少次使这个数变成111。思路就是b+1b+1b+1乘到aaa的质因子幂次的和代码bool vis[maxn];//标记非素数,0是素数int prime原创 2020-12-09 19:52:06 · 93 阅读 · 0 评论 -
Codeforces 1349 A
传送门题目大意给定长度为nnn的序列a1,a2...ana_1,a_2...a_na1,a2...an.设可重集S={lcm(ai,aj)∣1≤i<j≤n}S=\{{lcm(a_i,a_j)|1\leq i<j\leq n}\}S={lcm(ai,aj)∣1≤i<j≤n}.求出gcd(S)gcd(S)gcd(S)1≤n≤105,1≤ai≤2∗1051\leq n\leq 10^5,1\leq a_i\leq 2*10^51≤n≤105,1≤ai≤2∗105.思路原创 2020-12-08 15:25:20 · 94 阅读 · 0 评论 -
Codeforces 75 C
传送门题目大意找出a,ba,ba,b的最大公因子,然后给几个查询,每次查询包含l,rl,rl,r两个数字,查询在l,rl,rl,r之间的a,ba,ba,b的最大公因子思路先找到a,ba,ba,b的最大公约数gcdgcdgcd,将gcdgcdgcd的因子求出来,每次询问二分寻找小于rrr的最大的因子,看看是否大于等于lll即可。代码int gcd(int a,int b){ return !b?a:gcd(b,a%b);} int x[maxn];int main(){ int a,b原创 2020-12-07 21:35:34 · 106 阅读 · 0 评论 -
Codeforces 237 C
传送门题目大意现在给定一个正整数序列a,a+1,a+2,...b,(a≤b)a,a+1,a+2,...b,(a\leq b)a,a+1,a+2,...b,(a≤b),请找出一个最小值lll,使其满足对于任意一个长度为lll的子串,都包含kkk个质数。找到并输出符合要求的最小值lll, 如果不存在符合要求的长度lll, 则输出−1-1−1。思路用队列维护,保证队列有k个数,取最大的范围就好代码bool vis[maxn];//标记非素数,0是素数int primer[maxn/10];//存素原创 2020-12-07 20:08:02 · 84 阅读 · 0 评论 -
Codeforces 154 B
传送门题目大意n个数 m个操作‘+’代表打开对撞机‘-’ 代表关闭对撞机前提保证打开的对撞机两两互质打开:可以激活 输出“Success”已经激活了 输出“Already on”与j冲突了,即不能打开 输出“Conflict with j”关闭:可以关闭 输出“Success”已经关闭了 输出“Already off”思路找到每个的质因子,在打开时判断是否有质因子已经打开的就好了代码///打表最小质因子 bool vis[maxn];//标记非素数,0是素数int pr原创 2020-12-07 11:05:43 · 143 阅读 · 0 评论 -
Codeforces 1025 B
传送门题目大意给出n对数,问是否存在一个数,使得没对数都能找出至少一个数的因子包含该数。思路找到第一对数所有的质因子,暴力查找其他组有没有即可…好像写麻烦了…代码bool vis[maxn];//标记非素数,0是素数int primer[maxn/10];//存素数int cnt=0;//记录素数个数,void find_primer(){ for(int i=2;i <=maxn;i++){ if(!vis[i])primer[cnt++]=i;原创 2020-12-07 10:53:36 · 63 阅读 · 0 评论 -
Codeforces 399 B
传送门题目大意原创 2020-12-04 11:16:24 · 111 阅读 · 1 评论 -
Codeforces 1344 A
传送门题目大意给你一个无限长的数轴还有一个大小为n的整数数组a0,a1...an−1a_0,a_1...a_{n-1}a0,a1...an−1对于数轴上的所有表示整数的点,我们需要将它们同时移动。对于任意一个整数k,k 将会被移动到k+ak mod nk+a_{k\ mod\ n}k+ak mod n所在的位置。现在请你判断移动后是否有任意两个整数的位置相同思路对0到n-1进行模拟操作,判断是否重合即可代码int a[maxn];map<i原创 2020-12-02 13:16:37 · 104 阅读 · 0 评论 -
Codeforces 235 A
传送门题目大意找到3个不超过n的正整数(可以相同),使得它们的lcm最大,输出最大的lcm思路分析当n是奇数时,n,n-1,n-2三个数一定两两互质当n是偶数时,第一种情况 n-1,n-2,n-3三个数一定两两互质 第二种情况当n%3!=0时,n,n-1,n-3一定两两互质最后特判一下n为1或2的情况就好了代码int main(){ ll n; scanf("%lld",&n); if(n==1){ printf("1"); return 0; } if(n==2)原创 2020-11-29 14:12:24 · 176 阅读 · 0 评论 -
Codeforces 343 A
传送门题目大意一个电阻器件电阻R0=1两个电阻器件可以串联也可以并联串联R=R1+R2并联R=11R1+1R2问合成ab最少需要多少个电阻一个电阻器件电阻R_0=1\\两个电阻器件可以串联也可以并联\\串联R=R_1+R_2\\并联R=\frac{1}{\frac{1}{R_1}+\frac{1}{R_2}}\\问合成\frac{a}{b}最少需要多少个电阻一个电阻器件电阻R0=1两个电阻器件可以串联也可以并联串联R=R1+R2并联R=R11+R211问合成ba最少需要多少个电阻思原创 2020-11-29 14:03:22 · 106 阅读 · 0 评论 -
Codeforces 368 A
传送门题目大意π(n)为不大于n的素数的个数rub(n)为不大于n的回文的个数输入一个变量A,找到最大的n使得π(n)≤A∗rub(n)输入两个数p,q,A=pq,p,q≤104,142≤pq≤42如果存在答案,打印答案,否则打印"Palindromictreeisbetterthansplaytree"\pi(n)为不大于n的素数的个数\\rub(n)为不大于n的回文的个数\\输入一个变量A,找到最大的n使得\pi(n)\leq A*rub(n)\\输入两个数p,q,A=\frac{p}{q},p,原创 2020-11-26 12:59:08 · 177 阅读 · 0 评论 -
Codeforces 1305 C
传送门题目大意给你一个长度为n的序列,求出∏1≤i<j≤n∣ai−aj∣ mod m给你一个长度为n的序列,求出\prod_{1\leq i<j\leq n}|a_i-a_j|\ mod \ m给你一个长度为n的序列,求出1≤i<j≤n∏∣ai−aj∣ mod m思路当n>m的时候,一定会有两个数对m取余相同,那么答案就是0,否则直接暴力计算就好了代码ll a[maxn];int main(){ int n,m;原创 2020-11-25 20:40:52 · 98 阅读 · 0 评论 -
Codeforces 337 C
传送门题目大意给出n道题,假设答对了m道题,求最小的分数,有一个规则,就是连续答对num==k道题那么分数就翻倍,然后num清零,重新开始计数思路先找到最大的不翻倍的个数ans=n/k*(k-1)+n%k如果m<=ans 那么答案就是m接下来求m>ans的情况一定是前面是连着的,越往前答案越小答案就是连着的+后面不连的后面不连着的个数ans-sheng*(k-1)前面连着的个数 2k (2k+k)*2 (6k+k)*2 (14k+k)*2会发现2 6 14 30 是2^(n原创 2020-11-24 18:41:50 · 113 阅读 · 0 评论 -
Codeforces 922 C
传送门题目大意给你两个数n,k,问n mod i(1<=i<=k)是不是都不相同思路暴力打表找规律发现n%i必须等于i-1才可以不出现重复的代码int main(){ int ans=1; ll n,k; scanf("%lld%lld",&n,&k); if(n==0&&k==0)return 0; for(ll i=1;i<=k;i++){ if(n%i!=i-1) { ans=0; break;原创 2020-11-23 20:28:24 · 81 阅读 · 0 评论 -
Codeforces 225 B
传送门题目大意题目中介绍了一个与斐波那契数列相识的k-bonacci数列。斐波那契数列是第一二项为1,从第三项开始,每一项等于前两项之和。而题中k-bonacci数列是前k-1项=0;第k项=1;从第k+1项开始,每一项等于前k项之和。现在给你s,s是由两个以上不同的k-bonacci数加和而成,当然k会给出。问你加和成s的k-bonacci数是那些?输出个数,并且输出这些k-bonacci数。(有多组的话,只需随便输出一组)思路打表直接找就行了,一定会存在一组满足的代码int k;int a原创 2020-11-22 15:34:59 · 83 阅读 · 0 评论 -
Codeforces 992 B
传送门题目大意问闭区间[l,r]内存在多少对a,b满足gcd(a,b)=x,lcm(a,b)=y;思路代码原创 2020-11-21 16:20:07 · 95 阅读 · 0 评论 -
Codeforces 346 A
传送门题目大意两个人从集合中取数,任意取出两个不同的数,集合中不能包含取出数的 |x-y|,如果谁取出的两个数字中的 |x-y|在集合中,那么这个人就输了,输出获胜一方的名字。思路游戏结束的标志是无法取出两个不同的数,即无论取出那两个数字,他们的绝对差都在集合中,换句话说,最终状态就是一个首项等于公差的等差数列,求出这个数列的项数减 n 就是游戏进行的回合数。所以我们要先求出首项。设首项为d,接下来d+d,d+2d….后面几项都是首项的倍数,所以我们可以用gcd(a1,a2,a3…an)求出。ans原创 2020-11-20 21:33:08 · 91 阅读 · 0 评论 -
Codeforces 735 D
传送门题目大意将一个数字分解成若干个数字相加,求分解后的每一个数字的最大因子之和(最大因子不包括本身)思路哥德巴赫猜想1.任一大于2的偶数都可写成两个质数之和2.任一大于7的奇数都可写成三个质数之和注意奇数也有可能是两个素数的和一个欧拉筛,打表到1e7,大于1e7的直接判断是否是素数即可。代码bool vis[maxn];//标记非素数,0是素数int primer[maxn/10];//存素数int cnt=0;//记录素数个数,void find_primer(){ f原创 2020-11-19 12:53:12 · 100 阅读 · 0 评论 -
Codeforces 1423 K
传送门题意给你一个n,问1~n中有多少个数字找不到一个数使其满足x=gcd(a,b) y=agcd(a,b) z=bgcd(a,b)x,y,z能构成三角形x=gcd(a,b)\ \ y=\frac{a}{gcd(a,b)}\ \ z=\frac{b}{gcd(a,b)}\\x,y,z能构成三角形x=gcd(a,b) y=gcd(a,b)a z=gcd(a,b)bx,y,z能构成三角形思路合数一定可以,素原创 2020-11-17 20:41:19 · 138 阅读 · 0 评论 -
Codeforces 375 A
传送门题目大意:给定一个数字,数字一定包含1 6 8 9,问是否有一种排列方式(不含前导零)使得这个数 mod 7 =0思路:1 6 8 9 全排列对7取余的余数为 0 1 2 3 4 5 6因为一定包含1 6 8 9 ,假定后四位由1689组成,则前面%7一定是0-6并且有一种1689组成可以满足打表找到可以满足的数代码打表int a[10]={1869,1968,6918,6198,1698,1986,1896};int main(){ //1689 全排列中,mod 7 //原创 2020-11-17 13:57:42 · 93 阅读 · 0 评论 -
Codeforces 1342 C
传送门题目描述:题意问l到r内有多少个数满足((x mod a) mod b) ≠ ((x mod b) mod a)问l到r内有多少个数满足((x\ mod\ a)\ mod\ b)\ \neq\ ((x\ mod\ b)\ mod\ a)问l到r内有多少个数满足((x mod a) mod b) = ((x mod&nb原创 2020-11-16 11:16:14 · 102 阅读 · 0 评论