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(思维)的主要内容,如果未能解决你的问题,请参考以下文章

D. Deleting 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