【CodeForces - 1647D】Madoka and the Best School in Russia(分类讨论,因数分解)
题目链接
题意:
判断一个数nnn,能否有至少两种方法将其表示为
n=a1a2...akn=a_1a_2...a_kn=a1a2...ak(k>=1k>=1k>=1),需要满足对每一个aia_iai都有:
ai%d==0a_i \% d==0ai%d==0
and
ai%d2!=0a_i\%d^2 != 0ai%d2!=0
先上代码:
代码:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<math.h>
using namespace std;
typedef long long ll;
bool Judge_prime(int x){if(x == 1)return true;for(int i = 2;i <= x/i;i++){if(x%i == 0){return false;}}return true;
}bool Judge_square(int x){int sq = sqrt(x);return sq*sq == x;
}int main(){int t;scanf("%d",&t);while(t--){int n,d;scanf("%d%d",&n,&d);int k = 0;while(n%d == 0) {k++;n /= d;}int p = n;if(k <= 1){printf("NO\n");}else if(k == 2){if(Judge_prime(p)){printf("NO\n");}else{printf("YES\n");}}else if(k == 3){if(!Judge_prime(p)){printf("YES\n");}else{if(Judge_prime(d)){printf("NO\n");}else{if(Judge_square(d) && (ll)p*p == d){printf("NO\n");}else{printf("YES\n");}}}}else{if(!Judge_prime(p)){printf("YES\n");}else{if(Judge_prime(d)){printf("NO\n");}else{printf("YES\n");}}}}return 0;
}
思路讲解
考虑将nnn形式化分解为:
n=dkpn=d^kpn=dkp,其中,p%d!=0p\%d!=0p%d!=0.
1、当k=0k = 0k=0或k=1k = 1k=1时,显然不行.
2、当k=2k = 2k=2时,即n=d2pn=d^2pn=d2p,显然,将ppp给其中一个ddd是一种合法方案,接下来探索第2种方案。
·当ppp是素数时,不可行。
·当ppp是合数时,设p=xy(x,y>1)p=xy(x,y>1)p=xy(x,y>1) ,则n=(dx)(dy)n=(dx)(dy)n=(dx)(dy)又是一种合法方案,可行。
3、当k=3k=3k=3时,n=dddpn=dddpn=dddp。
·当ppp是合数时,设p=xyp=xyp=xy,则n=d(xd)(yd)n=d(xd)(yd)n=d(xd)(yd)又是一种合法方案。
·当ppp是素数时
··当ddd是素数时:不可行;
··当ddd是合数时:
···当ddd是完全平方数且p∗p=dp*p=dp∗p=d,则不可行;
···否则可以,因为一定可以使得d=xy(x,y>1,x!=y)d=xy(x,y>1,x!=y)d=xy(x,y>1,x!=y),将(xp)(xp)(xp)和(y)(y)(y),或者(yp)(yp)(yp)和(x)(x)(x)分配给剩下两个ddd,且dxpdxpdxp或dypdypdyp不是d2d^2d2的倍数。
4、当k>=4k>=4k>=4时
·如果ppp是素数,则看ddd
··如果ddd是素数,则不行;否则可行。
·如果ppp是合数,则可行。
由于ppp可能为1,这里我们认为在对于ppp和ddd的判断上,1是“素数”。
【CodeForces - 1647D】Madoka and the Best School in Russia(分类讨论,因数分解)相关推荐
- codeforces数学1700[CodeForces 1336B[分类讨论+二分]CodeForces - 1301C[组合计数的减法原理]]
CodeForces 1336B Xenia and Colorful Gems 题目大意:给你nrn_rnr个xix_ixi,ngn_gng个yiy_iyi,nbn_bnb个ziz_izi ...
- Codeforces Round #408 (Div. 2)-C. Bank Hacking-(三种方法)分类讨论,二分,集合
补题速度太慢了,这样可不行啊. 代码里都有解释. 看别人代码有三种写法 set,分类,和二分. 这是个是用分类思想写的, #include <bits/stdc++.h> using na ...
- Problem - 1190B - Codeforces(分类讨论博弈)
Problem - 1190B - Codeforces 题目大意:有nnn堆石子,每堆的数目为aia_iai,现在Alice和Bob两个人可以移走任意一堆不为空的石子中的一颗石子,如果某人移动完石 ...
- Vasya and Multisets CodeForces - 1051C 模拟|分类讨论
题意:把数组分成两个集合 每个集合中元素数量为1的个数相同(此个数可以是0) 分析: 这类问题就是要各种可能情况考虑到 然后分类讨论 完整地正确分类就AC 否则gg 如果数量为 ...
- [因子背包] CF1647D Madoka and the Best School in Russia
由这次的D题从杜老师那学会的比较新奇的背包,我暂且将其命名为因子背包 题意: 一个数xxx被称为好数,当且仅当他被ddd整除而不被d2d^2d2整除. 给定一个数nnn,问是否有超过两种组成方式,让它 ...
- CF1647D Madoka and the Best School in Russia(数论,dp,离散化技巧)
题目链接 题意 给定 1e9 以内的正整数 n,d,问 n 能否由至少两种不同的方式由漂亮数相乘得到: 漂亮数的定义为:能被 d 整除,但不能被 d * d 整除: 思路 n 有一系列数相乘得到,则每 ...
- codeforces:C. Another Array Problem【分类讨论 + 找规律】
目录 题目截图 题目分析 ac code 总结 题目截图 题目分析 做cf题目别老想着套算法模版 找规律才是正道,这就是所谓的「思维」 n = 2很简单 n >= 4: # 肯定有一个最大值,不 ...
- Codeforces Round #777 (Div. 2) 简训
Codeforces Round #777 (Div. 2) 简训 导语 涉及的知识点 题目 A Madoka and Math Dad B Madoka and the Elegant Gift C ...
- Codeforces Round #777 (Div. 2) (A-D题解)
源代码:ACM/OpenjudgeNow/Codeforces at master · abmcar/ACM (github.com) 更好的阅读体验: 折跃坐标 碎碎念:不亏是俄罗斯场+二次元出题人 ...
最新文章
- android ui篇
- 【Transformer】Augmented Shortcuts for Vision Transformers
- Android之bitmap压缩的几种方法的解读
- sklearn集成学习概述
- 儒枭:我看技术人的成长路径
- final 最终 演练 java
- 从Python 2切换到Python 3:您需要了解的内容
- WCF 4.0 进阶系列 – 第十六章 使用回调合约发布和订阅事件(第二部分)
- homebrew安装失败的解决方案
- js混淆还原工具_混淆过的js代码如何还原?
- 自定义View合辑(2)-饼状图
- Spring之控制反转(IOC)
- OCR(图片识别)之 百度 VS 谷歌
- 2021年塔式起重机司机考试及塔式起重机司机复审考试
- LVS负载均衡DR模式安装和配置过程详解
- 如何将C盘下的“用户”文件夹改为英文“Users”
- ubuntu常用命令大全(转)
- 基于用户消费行为的窃电检测(看完论文后的自行总结)
- Matlab 基础04 - 冒号Colon operator “:”的使用和复杂应用详析
- 批归一化作用_为什么数据要做归一化处理,什么是批归一化?