首页 > 其他分享 >AtCoder Beginner Contest 280

AtCoder Beginner Contest 280

时间:2022-12-04 16:13:08浏览次数:57  
标签:AtCoder Beginner ... ll ans mid 280 n1 pi

D - Factorial and Multiple

数论

 

 首先上这道题需要的数论知识:

  n!的素因子分解中,n!=p1^a1 * p2^a2 * p3^a3 * ..... * pk^ak中

对于素因数pi,其对于的ai=n/pi+n/pi^2+n/pi^3+....直到n/pi^j==0为止

 证明如下:

  对于 n!= 1* 2 * 3* 4 * ...... * n

  其中的数可以表达成: 1 2 3 ...pi ....2pi....n1pi....n,用变量num来记录n!钟表pi的个数

其中  n1*pi<=n  && (n1+1)*pi>n

那么现在明显的pi个数为 n1, 且有 n1= n/pi ,所以 ans+=n1;

 

  但是可能 n1>=pi,即会有  原来的序列可以表达成:

  1 2 3...pi...2pi...3pi...pi*pi...2*pi*pi....3pi*pi.....n2*pi*pi...n

其中   n2*pi*pi<=n && (n2+1)*pi>n

其实这里的n2*pi*pi==上面的n1*pi,只是n1=n2*pi,那么在原来已经求得ans=n1的基础上,ans+=n1/pi

 

  但是还可能n2>=pi,接下来的操作与上面相同,像递归一样

于是有:

  对于素因数pi,其对于的ai=n/pi+n/pi^2+n/pi^3+....直到n/pi^j==0为止

 题解:

然后再看题目

  我们首先可以对K进行素数分解,O(sqrt(K))

  然后,对n进行二分求解,即l=1,r=k;进行二分查找,对于mid=(l+r)>>1,看一下mid!的全部素因数的幂 是否>=K的全部素因数的幂

如果>=说明 mid! % K==0,否则不是

 

 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 typedef long long ll;
 6 const int N = 1e7;
 7 ll k, t;
 8 int pos = 0;
 9 ll p[N], a[N];
10 bool check(ll mid)
11 {
12     for (int i = 1; i <= pos; i++)
13     {
14         ll n = mid, prime = p[i], num = 0;
15         while (n)
16         {
17             num += n / prime;
18             n /= prime;
19         }
20         if (num < a[i])
21             return false;
22     }
23     return true;
24 }
25 int main()
26 {
27     cin >> k;
28     ll l = 1, r = k, ans;
29     for (ll i = 2; i * i <= k; i++)
30     {
31         if (k % i == 0)
32         {
33             p[++pos] = i;
34             while (k % i == 0)
35             {
36                 a[pos]++;
37                 k /= i;
38             }
39         }
40     }
41     if (k > 1)
42     {
43         p[++pos] = k;
44         a[pos]++;
45     }
46     /*  for (int i = 1; i <= pos; i++)
47          cout << p[i] << " " << a[i] << endl;
48   */
49     while (l <= r)
50     {
51         ll mid = (l + r) >> 1;
52         if (check(mid))
53         {
54             ans = mid;
55             r = mid - 1;
56         }
57         else
58             l = mid + 1;
59     }
60     cout << ans;
61     return 0;
62 }

 

标签:AtCoder,Beginner,...,ll,ans,mid,280,n1,pi
From: https://www.cnblogs.com/cilinmengye/p/16949992.html

相关文章

  • abc--280--F
    F-PayorReceive题目大意给你一个图,查询两个点的最长路边权是正着走是正数,反着走为负数无法到达为nan,无穷大为inf注意:会有重边和自环思路用并查集划分连通块,用df......
  • abc--280--E
    题目大意一个人有n条命,你有p%的概率一次打它两条命,有(100-p)%的概率一次打他一条命求你打死它需要的次数的期望值思路其实也就和走台阶的那个题目是一样的,用dp写就行了......
  • abc--280--D
    D-FactorialandMultiple题目大意找到一个最小的n,使得n的阶乘能整除k思路将它化为一堆的质数,然后满足这些质数至少需要多大的数最后这个找最大的数的时候,直接暴力......
  • AtCoder Beginner Contest 280 题解
    A-PawnonaGrid看样例猜题意(要求的是#的数量,直接判断。//If,oneday,Ifinallymanagetomakemydreamsareality...//Iwonder,willyoustillbethere......
  • AtCoder Beginner Contest 280 D-E
    D-FactorialandMultiple前置知识\(n!\)中包含素因子\(p\)的个数为\[cnt=\sum\limits_{k\geq1}^{p^k\leqn}\lfloor\frac{n}{p^k}\rfloor\]例如:\(n!\)......
  • ORA-28040: 没有匹配的验证协议
    问题:ORA-28040:没有匹配的验证协议原因:Oracle数据库安装的是12.2版本,OracleClient安装的版本是11(ODTwithODAC1120320_32bit)。解决:打开 sqlnet.ora 文件,增加以下两行......
  • mysql学习系列:总结数据库连接不上的数种情况,问题编号:ERROR 1045 (28000)
    (文章目录)场景今天重启CDH的时候,发现重启报错,查看日志才发现是mysql数据库连接不上。在尝试解决的过程中,踩到一些坑。所以总结一下,并分享给大家看看,减少大家伙继续踩坑的......
  • AtCoder Beginner Contest 247 题解
    AtCoderBeginnerContest247Solution目录AtCoderBeginnerContest247Solution更好的阅读体验戳此进入题面链接题面Luogu链接A-MoveRight题面SolutionCodeB-U......
  • 二维前缀和 P2280 激光炸弹
      #include<iostream>#include<algorithm>usingnamespacestd;ints[5005][5005],n,r;voidsov(){inti,j,ans=0;intx,y,z;cin>>n>>r;......
  • 2280. 最优标号
    题目链接2280.最优标号给定一个无向图\(G=(V,E)\),每个顶点都有一个标号,它是一个\([0,2^{31}-1]\)内的整数。不同的顶点可能会有相同的标号。对每条边\((u,v)\),我......