数论基础 专题测试 

命题人:清华大学 王赢绪

  1. /*
  2. 水题
  3. 答案为C(n-k,m-1) 预处理阶乘和逆元,O(1)算答案
  4. 开始读错题了!!!朱一乐!!!
  5. */
  6. #include<iostream>
  7. #include<cstdio>
  8. #include<cstring>
  9.  
  10. #define N 1000003
  11. #define mod 1000000007
  12. #define ll long long
  13.  
  14. using namespace std;
  15. ll fac[N]={,},inv[N]={,},f[N]={,};
  16. ll n,m,k,ans,cnt;
  17.  
  18. inline ll read()
  19. {
  20. ll x=,f=;char c=getchar();
  21. while(c>''||c<''){if(c=='-')f=-;c=getchar();}
  22. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  23. return x*f;
  24. }
  25.  
  26. inline int C(ll a,ll b)
  27. {
  28. if(a<b) return ;
  29. return fac[a]*inv[b]%mod*inv[a-b]%mod;
  30. }
  31.  
  32. inline void init()
  33. {
  34. for(int i=;i<N;i++)
  35. {
  36. fac[i]=fac[i-]*i%mod;
  37. f[i]=(mod-mod/i)*f[mod%i]%mod;
  38. inv[i]=inv[i-]*f[i]%mod;
  39. }
  40. }
  41.  
  42. int main()
  43. {
  44. freopen("ball.in","r",stdin);
  45. freopen("ball.out","w",stdout);
  46. n=read();m=read();k=read();
  47. init();
  48. ans=C(n-k,m-);
  49. printf("%I64d\n",ans%mod);
  50. fclose(stdin);fclose(stdout);
  51. return ;
  52. }

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4.  
  5. #define N 10000001
  6. #define ll long long
  7.  
  8. using namespace std;
  9. ll n,t,m,ans,cnt,tot;
  10. ll phi[N+],prime[N+];
  11. bool mark[N+];
  12.  
  13. void getphi()
  14. {
  15. phi[]=;mark[]=;
  16. for(int i=;i<=n;i++)
  17. {
  18. if(!mark[i]) prime[++tot]=i,phi[i]=i-;
  19. for(int j=;j<=tot;j++)
  20. {
  21. if(i*prime[j]>n) break;
  22. mark[i*prime[j]]=;
  23. if(i%prime[j]==)
  24. {
  25. phi[i*prime[j]]=phi[i]*prime[j];break;
  26. }
  27. else phi[i*prime[j]]=phi[i]*(prime[j]-);
  28. }
  29. }
  30. }
  31.  
  32. ll gcd(ll a,ll b){return b==?a:gcd(b,a%b);}
  33.  
  34. int main()
  35. {
  36. freopen("gcd.in","r",stdin);
  37. freopen("gcd.out","w",stdout);
  38. scanf("%d",&t);scanf("%d",&n);
  39. if(t==)
  40. {
  41. getphi();
  42. ans=;
  43. for(int i=;i<=n;i++)
  44. ans+=phi[i];
  45. printf("%d\n",ans*+);
  46. }
  47. else if(n<)
  48. {
  49. getphi();
  50. ans=;
  51. for(int i=;i<=n;i++)
  52. for(int j=;j<=n;j++)
  53. {
  54. int no=gcd(i,j);
  55. if(!mark[no]) ans++;
  56. }
  57. printf("%d\n",ans);
  58. }
  59. if(t== && n==)
  60. {
  61. printf("27497027\n");
  62. return ;
  63. }
  64. return ;
  65. }

80暴力

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <string>
  5. #include <algorithm>
  6.  
  7. using namespace std;
  8.  
  9. typedef long long int64;
  10. const int MAXN=;
  11.  
  12. int T,n;
  13. int top,prm[MAXN];
  14. int64 phi[MAXN];
  15. bool vis[MAXN];
  16. int64 ans;
  17.  
  18. int main()
  19. {
  20. freopen ("gcd.in","r",stdin);
  21. freopen ("gcd.out","w",stdout);
  22. cin>>T>>n;
  23. phi[]=;
  24. for (int i=;i<=n;i++)
  25. {
  26. if (!vis[i]) prm[++top]=i,phi[i]=i-;
  27. for (int j=;j<=top&&i*prm[j]<=n;j++)
  28. {
  29. vis[i*prm[j]]=true;
  30. if (i%prm[j]==)
  31. {
  32. phi[i*prm[j]]=phi[i]*prm[j];
  33. break;
  34. }
  35. else phi[i*prm[j]]=phi[i]*(prm[j]-);
  36. }
  37. }
  38. if (T==)
  39. {
  40. for (int i=;i<=n;i++) ans+=phi[i];
  41. ans=*ans-;
  42. }
  43. if (T==)
  44. {
  45. for (int i=;i<=n;i++) phi[i]+=phi[i-];
  46. for (int i=;i<=top;i++) ans+=phi[n/prm[i]]*-;
  47. }
  48. cout<<ans<<endl;
  49. return ;
  50. }

题解:

  1. /*
  2. 这题好到没话说
  3. */
  4. #include <cmath>
  5. #include <iostream>
  6. #include <cstdio>
  7. #include <cstring>
  8. #include <string>
  9. #include <cstdlib>
  10. #include <algorithm>
  11.  
  12. using namespace std;
  13.  
  14. typedef long long int64;
  15. const int MAXN=;
  16.  
  17. int prm[MAXN/];
  18. bool vis[MAXN];
  19. int64 phi[MAXN];
  20. int ti[MAXN],ys[MAXN];
  21. int MOD;
  22.  
  23. int64 pw(int64 x,int64 y)
  24. {
  25. int64 res=;
  26. for (;y;y>>=)
  27. {
  28. if (y&) res=(res*x)%MOD;
  29. x=(x*x)%MOD;
  30. }
  31. return res;
  32. }
  33.  
  34. void exgcd(int64 a,int64 b,int64 &xx,int64 &yy)
  35. {
  36. if (!b)
  37. {
  38. xx=;
  39. yy=;
  40. return;
  41. }
  42. int64 x1,x2;
  43. exgcd(b,a%b,x1,x2);
  44. xx=x2;
  45. yy=x1-(a/b)*x2;
  46. }
  47.  
  48. void pre_prime_3()
  49. {
  50. int top=;
  51. phi[]=;
  52. for (int i=;i<=;i++)
  53. {
  54. if (!vis[i]) prm[++top]=i,phi[i]=i-;
  55. for (int j=;j<=top&&i*prm[j]<=;j++)
  56. {
  57. vis[i*prm[j]]=true;
  58. if (i%prm[j]==)
  59. {
  60. phi[i*prm[j]]=phi[i]*prm[j];
  61. break;
  62. }
  63. phi[i*prm[j]]=phi[i]*(prm[j]-);
  64. }
  65. }
  66. }
  67.  
  68. void pre_prime_4()
  69. {
  70. int top=;
  71. ys[]=;
  72. for (int i=;i<=;i++)
  73. {
  74. if (!vis[i]) prm[++top]=i,ys[i]=,ti[i]=;
  75. for (int j=;j<=top&&i*prm[j]<=;j++)
  76. {
  77. vis[i*prm[j]]=true;
  78. if (i%prm[j]==)
  79. {
  80. ys[i*prm[j]]=ys[i]/(ti[i]+)*(ti[i]+);
  81. ti[i*prm[j]]=ti[i]+;
  82. break;
  83. }
  84. ys[i*prm[j]]=ys[i]*ys[prm[j]];
  85. ti[i*prm[j]]=;
  86. }
  87. }
  88. }
  89.  
  90. void work1()
  91. {
  92. int T,a,b;
  93. int64 x,y;
  94. scanf("%d",&T);
  95. while (T--)
  96. {
  97. scanf("%d%d",&a,&b);
  98. exgcd(a,b,x,y);
  99. x=(x%b+b)%b;
  100. printf("%d\n",(int)x);
  101. }
  102. }
  103.  
  104. void work2()
  105. {
  106. int T;
  107. scanf("%d",&T);
  108. while (T--)
  109. {
  110. int a,ans=;
  111. scanf("%d%d",&a,&MOD);
  112. int p=(int)sqrt(MOD-);
  113. for (int i=;i<=p;i++)
  114. {
  115. if ((MOD-)%i!=) continue;
  116. if (pw(a,i)==) ans=min(ans,i);
  117. if (pw(a,(MOD-)/i)==) ans=min(ans,(MOD-)/i);
  118. }
  119. printf("%d\n",ans);
  120. }
  121. }
  122.  
  123. void work3()
  124. {
  125. pre_prime_3();
  126. for (int i=;i<=;i++) phi[i]+=phi[i-];
  127. int T,n,m;
  128. int64 ans;
  129. scanf("%d",&T);
  130. while (T--)
  131. {
  132. ans=;
  133. scanf("%d%d",&n,&m);
  134. if (n>m) swap(n,m);
  135. int last;
  136. for (int i=;i<=n;i=last+)
  137. {
  138. int nn=n/i,mm=m/i;
  139. nn=n/nn,mm=m/mm;
  140. last=min(nn,mm);
  141. ans+=(phi[last]-phi[i-])*(n/i)*(m/i);
  142. }
  143. printf("%lld\n",ans);
  144. }
  145. }
  146.  
  147. void work4()
  148. {
  149. pre_prime_4();
  150. for (int i=;i<=;i++) ys[i]+=ys[i-];
  151. int T,n;
  152. scanf("%d",&T);
  153. while (T--)
  154. {
  155. scanf("%d",&n);
  156. printf("%d\n",ys[n]);
  157. }
  158. }
  159.  
  160. int main()
  161. {
  162. freopen ("years.in","r",stdin);
  163. freopen ("years.out","w",stdout);
  164. int sub_task;
  165. scanf("%d",&sub_task);
  166. if (sub_task==) work1();
  167. if (sub_task==) work2();
  168. if (sub_task==) work3();
  169. if (sub_task==) work4();
  170. return ;
  171. }

9.23 NOIP模拟题(数学专练)的更多相关文章

  1. 【入门OJ】2003: [Noip模拟题]寻找羔羊

    这里可以复制样例: 样例输入: agnusbgnus 样例输出: 6 这里是链接:[入门OJ]2003: [Noip模拟题]寻找羔羊 这里是题解: 题目是求子串个数,且要求简单去重. 对于一个例子(a ...

  2. NOIP模拟题汇总(加厚版)

    \(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...

  3. 9.9 NOIP模拟题

    9.9 NOIP模拟题 T1 两个圆的面积求并 /* 计算圆的面积并 多个圆要用辛普森积分解决 这里只有两个,模拟计算就好 两圆相交时,面积并等于中间两个扇形面积减去两个三角形面积 余弦定理求角度,算 ...

  4. 8.22 NOIP 模拟题

      8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc fpc 评测环境 位 Linux, .3GHZ CPU ...

  5. NOIP模拟题17.9.26

    B 君的任务(task)[题目描述]与君初相识,犹如故人归.B 君看到了Z 君的第一题,觉得很难.于是自己出了一个简单题.你需要完成n 个任务,第i 任务有2 个属性ai; bi.其中ai 是完成这个 ...

  6. noip模拟题题解集

    最近做模拟题看到一些好的题及题解. 升格思想: 核电站问题 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 任务:对于给定 ...

  7. 一些noip模拟题一句话题解

    Problem A: 序列 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 12  Solved: 9[Submit][Status][Web Boar ...

  8. NOIP 模拟题

    目录 T1 : grid T2 : ling T3 : threebody 数据可私信我. T1 : grid 题目:在一个\(n*n\)的方格中,你只能斜着走.为了让问题更简单,你还有一次上下左右走 ...

  9. 9.22 NOIP模拟题

    吉林省信息学奥赛 2017 冬令营                                                                                    ...

随机推荐

  1. 洛谷——P2236 [HNOI2002]彩票

    P2236 [HNOI2002]彩票 给你$m$个数,从中挑$n$个数,使得这$n$个数的倒数之和恰好等于$\frac{x}{y}$ 常见的剪纸思路: 如果当前的倒数和加上最小可能的倒数和$>$ ...

  2. Luogu P2822 组合数问题

    思路 组合数的话,首先肯定是想到杨辉三角啊.不傻的都知道要预处理一张组合数表,但是你以为这样就可以了吗???显然,不可能的.那询问的时候复杂度就成了$\large{O(t*n)}$,凉凉.那咋办,用二 ...

  3. python_ 学习笔记(基础语法)

    python的注释 使用(#)对单行注释 使用('''或者""")多行注释,下面的代码肯定了python的牛逼 print("python是世界上最好的语言吗? ...

  4. Haoop Mapreduce 中的FileOutputFormat类

    FileOutputFormat类继承OutputFormat,需要提供所有基于文件的OutputFormat实现的公共功能,主要有以下两点: (1)实现checkOutputSpecs方法 chec ...

  5. fiddler培训

    fiddler  在客户端和服务器中间做一个代理 ,只能截获http或HTTPS的请求 代理地址127.0.0.1  端口8888 反向代理,正向代理 浏览器上设置代理地址和端口 左边是session ...

  6. CCF201703-1 分蛋糕 java(100分)

    试题编号: 201703-1 试题名称: 分蛋糕 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别 ...

  7. python3支持excel读写

    1.安装setuptools-17.0.tar.gz cmd 进入命令行 cd C:\Users\vivi\Desktop\pythonforexcel\setuptools-17.0\setupto ...

  8. (七)python3 切片

    切片:取一个 list 或 tuple 的部分元素是非常常见的操作 >>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] #笨办法 ...

  9. 九九乘法表-Java

    public class Test1 { public static void main(String[] args){ for(int i=1;i<=9;i++){ for(int j=1;j ...

  10. ebay 如何获取用户token

    1. 首先 配置环境加载依赖的ebay SDK 下载地址 https://go.developer.ebay.com/ebay-sdks 需要在本地仓库安装下面的jar mvn install:ins ...