9.23 NOIP模拟题(数学专练)
数论基础 专题测试
命题人:清华大学 王赢绪
- /*
- 水题
- 答案为C(n-k,m-1) 预处理阶乘和逆元,O(1)算答案
- 开始读错题了!!!朱一乐!!!
- */
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #define N 1000003
- #define mod 1000000007
- #define ll long long
- using namespace std;
- ll fac[N]={,},inv[N]={,},f[N]={,};
- ll n,m,k,ans,cnt;
- inline ll read()
- {
- ll x=,f=;char c=getchar();
- while(c>''||c<''){if(c=='-')f=-;c=getchar();}
- while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
- return x*f;
- }
- inline int C(ll a,ll b)
- {
- if(a<b) return ;
- return fac[a]*inv[b]%mod*inv[a-b]%mod;
- }
- inline void init()
- {
- for(int i=;i<N;i++)
- {
- fac[i]=fac[i-]*i%mod;
- f[i]=(mod-mod/i)*f[mod%i]%mod;
- inv[i]=inv[i-]*f[i]%mod;
- }
- }
- int main()
- {
- freopen("ball.in","r",stdin);
- freopen("ball.out","w",stdout);
- n=read();m=read();k=read();
- init();
- ans=C(n-k,m-);
- printf("%I64d\n",ans%mod);
- fclose(stdin);fclose(stdout);
- return ;
- }
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #define N 10000001
- #define ll long long
- using namespace std;
- ll n,t,m,ans,cnt,tot;
- ll phi[N+],prime[N+];
- bool mark[N+];
- void getphi()
- {
- phi[]=;mark[]=;
- for(int i=;i<=n;i++)
- {
- if(!mark[i]) prime[++tot]=i,phi[i]=i-;
- for(int j=;j<=tot;j++)
- {
- if(i*prime[j]>n) break;
- mark[i*prime[j]]=;
- if(i%prime[j]==)
- {
- phi[i*prime[j]]=phi[i]*prime[j];break;
- }
- else phi[i*prime[j]]=phi[i]*(prime[j]-);
- }
- }
- }
- ll gcd(ll a,ll b){return b==?a:gcd(b,a%b);}
- int main()
- {
- freopen("gcd.in","r",stdin);
- freopen("gcd.out","w",stdout);
- scanf("%d",&t);scanf("%d",&n);
- if(t==)
- {
- getphi();
- ans=;
- for(int i=;i<=n;i++)
- ans+=phi[i];
- printf("%d\n",ans*+);
- }
- else if(n<)
- {
- getphi();
- ans=;
- for(int i=;i<=n;i++)
- for(int j=;j<=n;j++)
- {
- int no=gcd(i,j);
- if(!mark[no]) ans++;
- }
- printf("%d\n",ans);
- }
- if(t== && n==)
- {
- printf("27497027\n");
- return ;
- }
- return ;
- }
80暴力
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <string>
- #include <algorithm>
- using namespace std;
- typedef long long int64;
- const int MAXN=;
- int T,n;
- int top,prm[MAXN];
- int64 phi[MAXN];
- bool vis[MAXN];
- int64 ans;
- int main()
- {
- freopen ("gcd.in","r",stdin);
- freopen ("gcd.out","w",stdout);
- cin>>T>>n;
- phi[]=;
- for (int i=;i<=n;i++)
- {
- if (!vis[i]) prm[++top]=i,phi[i]=i-;
- for (int j=;j<=top&&i*prm[j]<=n;j++)
- {
- vis[i*prm[j]]=true;
- if (i%prm[j]==)
- {
- phi[i*prm[j]]=phi[i]*prm[j];
- break;
- }
- else phi[i*prm[j]]=phi[i]*(prm[j]-);
- }
- }
- if (T==)
- {
- for (int i=;i<=n;i++) ans+=phi[i];
- ans=*ans-;
- }
- if (T==)
- {
- for (int i=;i<=n;i++) phi[i]+=phi[i-];
- for (int i=;i<=top;i++) ans+=phi[n/prm[i]]*-;
- }
- cout<<ans<<endl;
- return ;
- }
题解:
- /*
- 这题好到没话说
- */
- #include <cmath>
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <string>
- #include <cstdlib>
- #include <algorithm>
- using namespace std;
- typedef long long int64;
- const int MAXN=;
- int prm[MAXN/];
- bool vis[MAXN];
- int64 phi[MAXN];
- int ti[MAXN],ys[MAXN];
- int MOD;
- int64 pw(int64 x,int64 y)
- {
- int64 res=;
- for (;y;y>>=)
- {
- if (y&) res=(res*x)%MOD;
- x=(x*x)%MOD;
- }
- return res;
- }
- void exgcd(int64 a,int64 b,int64 &xx,int64 &yy)
- {
- if (!b)
- {
- xx=;
- yy=;
- return;
- }
- int64 x1,x2;
- exgcd(b,a%b,x1,x2);
- xx=x2;
- yy=x1-(a/b)*x2;
- }
- void pre_prime_3()
- {
- int top=;
- phi[]=;
- for (int i=;i<=;i++)
- {
- if (!vis[i]) prm[++top]=i,phi[i]=i-;
- for (int j=;j<=top&&i*prm[j]<=;j++)
- {
- vis[i*prm[j]]=true;
- if (i%prm[j]==)
- {
- phi[i*prm[j]]=phi[i]*prm[j];
- break;
- }
- phi[i*prm[j]]=phi[i]*(prm[j]-);
- }
- }
- }
- void pre_prime_4()
- {
- int top=;
- ys[]=;
- for (int i=;i<=;i++)
- {
- if (!vis[i]) prm[++top]=i,ys[i]=,ti[i]=;
- for (int j=;j<=top&&i*prm[j]<=;j++)
- {
- vis[i*prm[j]]=true;
- if (i%prm[j]==)
- {
- ys[i*prm[j]]=ys[i]/(ti[i]+)*(ti[i]+);
- ti[i*prm[j]]=ti[i]+;
- break;
- }
- ys[i*prm[j]]=ys[i]*ys[prm[j]];
- ti[i*prm[j]]=;
- }
- }
- }
- void work1()
- {
- int T,a,b;
- int64 x,y;
- scanf("%d",&T);
- while (T--)
- {
- scanf("%d%d",&a,&b);
- exgcd(a,b,x,y);
- x=(x%b+b)%b;
- printf("%d\n",(int)x);
- }
- }
- void work2()
- {
- int T;
- scanf("%d",&T);
- while (T--)
- {
- int a,ans=;
- scanf("%d%d",&a,&MOD);
- int p=(int)sqrt(MOD-);
- for (int i=;i<=p;i++)
- {
- if ((MOD-)%i!=) continue;
- if (pw(a,i)==) ans=min(ans,i);
- if (pw(a,(MOD-)/i)==) ans=min(ans,(MOD-)/i);
- }
- printf("%d\n",ans);
- }
- }
- void work3()
- {
- pre_prime_3();
- for (int i=;i<=;i++) phi[i]+=phi[i-];
- int T,n,m;
- int64 ans;
- scanf("%d",&T);
- while (T--)
- {
- ans=;
- scanf("%d%d",&n,&m);
- if (n>m) swap(n,m);
- int last;
- for (int i=;i<=n;i=last+)
- {
- int nn=n/i,mm=m/i;
- nn=n/nn,mm=m/mm;
- last=min(nn,mm);
- ans+=(phi[last]-phi[i-])*(n/i)*(m/i);
- }
- printf("%lld\n",ans);
- }
- }
- void work4()
- {
- pre_prime_4();
- for (int i=;i<=;i++) ys[i]+=ys[i-];
- int T,n;
- scanf("%d",&T);
- while (T--)
- {
- scanf("%d",&n);
- printf("%d\n",ys[n]);
- }
- }
- int main()
- {
- freopen ("years.in","r",stdin);
- freopen ("years.out","w",stdout);
- int sub_task;
- scanf("%d",&sub_task);
- if (sub_task==) work1();
- if (sub_task==) work2();
- if (sub_task==) work3();
- if (sub_task==) work4();
- return ;
- }
9.23 NOIP模拟题(数学专练)的更多相关文章
- 【入门OJ】2003: [Noip模拟题]寻找羔羊
这里可以复制样例: 样例输入: agnusbgnus 样例输出: 6 这里是链接:[入门OJ]2003: [Noip模拟题]寻找羔羊 这里是题解: 题目是求子串个数,且要求简单去重. 对于一个例子(a ...
- NOIP模拟题汇总(加厚版)
\(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...
- 9.9 NOIP模拟题
9.9 NOIP模拟题 T1 两个圆的面积求并 /* 计算圆的面积并 多个圆要用辛普森积分解决 这里只有两个,模拟计算就好 两圆相交时,面积并等于中间两个扇形面积减去两个三角形面积 余弦定理求角度,算 ...
- 8.22 NOIP 模拟题
8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc fpc 评测环境 位 Linux, .3GHZ CPU ...
- NOIP模拟题17.9.26
B 君的任务(task)[题目描述]与君初相识,犹如故人归.B 君看到了Z 君的第一题,觉得很难.于是自己出了一个简单题.你需要完成n 个任务,第i 任务有2 个属性ai; bi.其中ai 是完成这个 ...
- noip模拟题题解集
最近做模拟题看到一些好的题及题解. 升格思想: 核电站问题 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 任务:对于给定 ...
- 一些noip模拟题一句话题解
Problem A: 序列 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 12 Solved: 9[Submit][Status][Web Boar ...
- NOIP 模拟题
目录 T1 : grid T2 : ling T3 : threebody 数据可私信我. T1 : grid 题目:在一个\(n*n\)的方格中,你只能斜着走.为了让问题更简单,你还有一次上下左右走 ...
- 9.22 NOIP模拟题
吉林省信息学奥赛 2017 冬令营 ...
随机推荐
- 洛谷——P2236 [HNOI2002]彩票
P2236 [HNOI2002]彩票 给你$m$个数,从中挑$n$个数,使得这$n$个数的倒数之和恰好等于$\frac{x}{y}$ 常见的剪纸思路: 如果当前的倒数和加上最小可能的倒数和$>$ ...
- Luogu P2822 组合数问题
思路 组合数的话,首先肯定是想到杨辉三角啊.不傻的都知道要预处理一张组合数表,但是你以为这样就可以了吗???显然,不可能的.那询问的时候复杂度就成了$\large{O(t*n)}$,凉凉.那咋办,用二 ...
- python_ 学习笔记(基础语法)
python的注释 使用(#)对单行注释 使用('''或者""")多行注释,下面的代码肯定了python的牛逼 print("python是世界上最好的语言吗? ...
- Haoop Mapreduce 中的FileOutputFormat类
FileOutputFormat类继承OutputFormat,需要提供所有基于文件的OutputFormat实现的公共功能,主要有以下两点: (1)实现checkOutputSpecs方法 chec ...
- fiddler培训
fiddler 在客户端和服务器中间做一个代理 ,只能截获http或HTTPS的请求 代理地址127.0.0.1 端口8888 反向代理,正向代理 浏览器上设置代理地址和端口 左边是session ...
- CCF201703-1 分蛋糕 java(100分)
试题编号: 201703-1 试题名称: 分蛋糕 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别 ...
- python3支持excel读写
1.安装setuptools-17.0.tar.gz cmd 进入命令行 cd C:\Users\vivi\Desktop\pythonforexcel\setuptools-17.0\setupto ...
- (七)python3 切片
切片:取一个 list 或 tuple 的部分元素是非常常见的操作 >>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] #笨办法 ...
- 九九乘法表-Java
public class Test1 { public static void main(String[] args){ for(int i=1;i<=9;i++){ for(int j=1;j ...
- ebay 如何获取用户token
1. 首先 配置环境加载依赖的ebay SDK 下载地址 https://go.developer.ebay.com/ebay-sdks 需要在本地仓库安装下面的jar mvn install:ins ...