D. Almost All Divisors(思维)
Posted letlifestop
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D. Almost All Divisors(思维)相关的知识,希望对你有一定的参考价值。
题目链接:https://codeforces.com/problemset/problem/1165/D
题目大意:
T组测试样例,然后n个数,问你能否求出一个数,他的因子个数是n+2个,除了1和本身,剩下的n个数就是输入的这n个数。如果有输出这个数的最小值,否则输出-1.
具体思路:
假设这个数是存在的,那么这个数的最大因子就是这n个数里面最大的,又因为这n个数里面肯定没有这个数本身,所以这个数存在的话,一定为最小的因子和最大的因子之积。
然后我们检验这个数的n个因子是不是合法的,然后判断一下因子的个数除了本身和1是否为n个就可以了。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 # define ll unsigned long long 4 # define inf 0x3f3f3f3f 5 const int maxn = 2e5+100; 6 const ll mod = 998244353 ; 7 ll a[maxn]; 8 int main() 9 { 10 int T; 11 scanf("%d",&T); 12 while(T--) 13 { 14 int n; 15 scanf("%d",&n); 16 for(int i=1; i<=n; i++) 17 { 18 scanf("%lld",&a[i]); 19 } 20 sort(a+1,a+n+1); 21 ll ans=a[1]*a[n]; 22 int flag=1; 23 for(int i=1; i<=n; i++) 24 { 25 if(ans%a[i]!=0) 26 flag=0; 27 } 28 if(!flag) 29 { 30 printf("-1\n"); 31 } 32 else 33 { 34 ll tmp=(int)sqrt(ans); 35 int cnt=0; 36 for(ll i=2; i<=tmp; i++) 37 { 38 if(ans%i==0) 39 { 40 cnt++; 41 if(ans/i!=i)cnt++;// 如果是9=3*3这类的,应该算一个 42 } 43 } 44 // cout<<cnt<<endl; 45 if(cnt==n) 46 printf("%lld\n",ans); 47 else printf("-1\n"); 48 } 49 } 50 return 0; 51 }
以上是关于D. Almost All Divisors(思维)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #726 (Div. 2) D. Deleting Divisors(博弈,思维)
博弈论:倒腾思维D. Deleting Divisors——Codeforces Round #726 (Div. 2)
博弈论:倒腾思维D. Deleting Divisors——Codeforces Round #726 (Div. 2)
Codeforces915 D. Almost Acyclic Graph(思维,拓扑排序原理,拓扑排序判环)
Codeforces Round #481 (Div. 3) D. Almost Arithmetic Progression