[关闭]
@Alpacadh 2019-02-20T22:20:32.000000Z 字数 2643 阅读 725

D、E、F

数学


D - Send a Table

题意:

解题思路:

代码:

  1. //#include<bits/stdc++.h>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<cstring>
  6. #include<stdio.h>
  7. #include<cstdlib>
  8. #include<cstdio>
  9. using namespace std;
  10. const int inf=0x3f3f3f3f;
  11. const int N=5e4+5;
  12. const double eps=1e-4;
  13. typedef long long ll;
  14. typedef pair<int,ll> pil;
  15. int phi[N];
  16. int p[N];
  17. int vis[N];
  18. int sum[N];
  19. void init(int n)
  20. {
  21. phi[1]=1;
  22. memset(vis, 0, sizeof(vis));
  23. int cnt=0;
  24. for(int i=2;i<=n;i++)
  25. {
  26. if(!vis[i])
  27. {
  28. p[cnt++]=i;
  29. phi[i]=i-1;
  30. }
  31. for(int j=0;j<cnt&&i*p[j]<= n;j++)
  32. {
  33. vis[i*p[j]]=1;
  34. if(i%p[j]==0)
  35. {
  36. phi[i*p[j]]=phi[i]*p[j];
  37. break;
  38. }
  39. else
  40. {
  41. phi[i*p[j]]=phi[i]*(p[j]-1);
  42. }
  43. }
  44. }
  45. sum[1]=phi[1];
  46. for(int i=2;i<=N;i++)
  47. sum[i]=sum[i-1]+phi[i];
  48. }
  49. int main()
  50. {
  51. int n;
  52. init(N);
  53. while(scanf("%d",&n))
  54. {
  55. if(n==0)
  56. break;
  57. printf("%d\n",2*sum[n]-1);
  58. }
  59. return 0;
  60. }

E - Huge Mods

题意:

解题思路:

代码:

  1. //#include<bits/stdc++.h>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<cstring>
  6. #include<stdio.h>
  7. #include<cstdlib>
  8. #include<cstdio>
  9. using namespace std;
  10. const int inf=0x3f3f3f3f;
  11. const int N=5e4+5;
  12. const double eps=1e-4;
  13. typedef long long ll;
  14. typedef pair<int,ll> pil;
  15. int phi[N];
  16. int p[N];
  17. int vis[N];
  18. int sum[N];
  19. ll get_phi(ll n)
  20. {
  21. int pp=n;
  22. for(int i=2;i*i<=n;i++)
  23. {
  24. if(n%i!=0)
  25. continue;
  26. pp=pp/i*(i-1);
  27. while(n%i==0)
  28. n/=i;
  29. }
  30. if(n>1)
  31. {
  32. pp=pp/n*(n-1);
  33. }
  34. return pp;
  35. }
  36. ll Mod(ll a,ll b)
  37. {
  38. return a<b?a:a%b+b;
  39. }
  40. ll pow_mod(ll a,ll b,ll p)
  41. {
  42. ll res=1;
  43. while(b)
  44. {
  45. if(b&1)
  46. res=Mod(res*a,p);
  47. a=Mod(a*a,p);
  48. b>>=1;
  49. }
  50. return res;
  51. }
  52. int a[N];
  53. int n,mod;
  54. ll dfs(int x,int p)
  55. {
  56. if(x==n)
  57. return Mod(a[x],p);
  58. int fp=get_phi(p);
  59. return pow_mod(a[x],dfs(x+1,fp),p);
  60. }
  61. char s[N];
  62. int main()
  63. {
  64. int tot=1;
  65. while(scanf("%s",s))
  66. {
  67. if(s[0]=='#')
  68. break;
  69. mod=atoi(s);//将s转化成int类型的
  70. scanf("%d",&n);
  71. for(int i=1;i<=n;i++)
  72. {
  73. scanf("%d",&a[i]);
  74. }
  75. printf("Case #%d: ",tot++);
  76. printf("%lld\n",dfs(1,mod)%mod);
  77. }
  78. return 0;
  79. }

F - Problem Makes Problem

题意:

解题思路:

代码:

  1. //#include<bits/stdc++.h>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<cstring>
  6. #include<stdio.h>
  7. #include<cstdlib>
  8. #include<cstdio>
  9. using namespace std;
  10. typedef long long ll;
  11. const int inf=0x3f3f3f3f;
  12. const int N=2e6+5;
  13. const double eps=1e-4;
  14. const ll mod=1e9+7;
  15. typedef pair<int,ll> pil;
  16. ll c[N];
  17. char s[N];
  18. void init()
  19. {
  20. c[0]=1;
  21. for(int i=1;i<N;i++)
  22. c[i]=c[i-1]*i%mod;
  23. }
  24. ll pow_mod(ll a,ll n)
  25. {
  26. ll res=1;
  27. while(n)
  28. {
  29. if(n&1)
  30. res=res*a%mod;
  31. a=a*a%mod;
  32. n>>=1;
  33. }
  34. return res;
  35. }
  36. ll comb(ll n,ll m)
  37. {
  38. if(n<m)
  39. return 0;
  40. return c[n]*pow_mod(c[m]*c[n-m]%mod,mod-2)%mod;//也可以预处理逆元得出组合数。
  41. }
  42. int main()
  43. {
  44. int tot=1;
  45. int t;
  46. init();
  47. scanf("%d",&t);
  48. while(t--)
  49. {
  50. ll n,k;
  51. scanf("%lld%lld",&n,&k);
  52. printf("Case %d: ",tot++);
  53. printf("%lld\n",comb(n+k-1,k-1));
  54. }
  55. return 0;
  56. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注