2017-9-22 NOIP模拟赛[xxy][数论]
XXY 的 的 NOIP 模拟赛 4 4 —— 数学专场
A
Description
定义 f(x)表示 x 的约数和,例:f(12)=1+2+3+4+6+12=28
给出 x,y,求Σf(i),i∈[x,y]
Input
一行两个整数 x,y
Output
一行表示答案
Example
两组输入数据
2 4
123 321
对应输出
14
72543
Hint
对于 20%的数据,1<=x<=y<=1000
对于 40%的数据,1<=x<=y<=1e7
对于 100%的数据,1<=x<=y<=2e9
#include<iostream>
#include<cstdio>
using namespace std;
long long x,y;
long long count(int x){
long long res=;
long long l=,r;
while(){
r=x/(x/l);
long long a=x/l;
res+=((l+r)*(r-l+)/)*a;
l=r+;
if(x/l==)break;
}
return res;
}
int main(){
freopen("A.in","r",stdin);
freopen("A.out","w",stdout);
cin>>x>>y;
long long ansl=count(x-);
long long ansr=count(y);
cout<<ansr-ansl;
}
90分 出现整数被0除的错误
#include<iostream>
#include<cstdio>
using namespace std;
long long x,y;
long long count(int x){
long long res=;
long long l=,r;
while(){
if(x/l==)r=x;
else r=x/(x/l);
long long a=x/l;
res+=((l+r)*(r-l+)/)*a;
l=r+;
if(x/l==)break;
}
return res;
}
int main(){
freopen("A.in","r",stdin);
freopen("A.out","w",stdout);
cin>>x>>y;
long long ansl=count(x-);
long long ansr=count(y);
cout<<ansr-ansl;
}
100分
B
Description
求满足以下条件的 x 的个数
① x∈[1,n!]
② 设 pi 为质数且 pi|x,那么 pi>m,对于所有的 pi 均成立
答案对 100000007 取模
Input
一行两个整数 n,m
Output
一行表示答案
Example
3 组输入样例
100 10
100 20
10000 9000
Output
对应 3 组输出
43274465
70342844
39714141
Hint
对于 20%的数据,n,m<=8
对于 60%的数据,n<=100000,m<=8
对于 100%的数据,n<=10000000,保证 n-m<=100000,m<=n
学到的一点东西
1.x的所有素因子大于m,则x与m!互素
2.已知phi[(i-1)!],递推地求phi[i!]
如果i是素数,phi[i!]=phi[(i-1)!]*(i-1)
如果i不是素数,phi[i!]=phi[(i-1)!]*i
3.phi[n!]=phi[m!]*(n!/m!)
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int p[],n,m,w=,ans,cnt;
bool vis[],q[];
void dfs(int pos,long long sum){
if(sum>w)return;
if(!q[sum]&&sum!=)ans++,q[sum]=;
//cout<<sum<<' ';
for(int i=pos;i<=cnt;i++){
if(sum*p[i]>w)return;
dfs(i,sum*p[i]);
}
}
int main(){
//freopen("Cola.txt","r",stdin);
freopen("B.in","r",stdin);
freopen("B.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)w*=i;
for(int i=;i<=w;i++){
if(!vis[i])p[++cnt]=i;
for(int j=;j<=cnt&&i*p[j]<=w;j++){
vis[i*p[j]]=;
if(i%p[j]==)break;
}
}
int pos=upper_bound(p+,p+cnt+,m)-p;
dfs(pos,);
for(int i=pos;i<=cnt;i++){
if(cnt>w)break;
if(!q[p[i]])ans++;
}
cout<<ans;
}
20分 暴力
#include<cstdio>
#define N 10000001
#define mod 100000007
using namespace std;
int cnt,p[],phi[N];
long long phifac[N];
bool v[N];
int main()
{
freopen("B.in","r",stdin);
freopen("B.out","w",stdout);
phi[]=;
for(int i=;i<N;i++)
{
if(!v[i])
{
p[++cnt]=i;
phi[i]=i-;
}
for(int j=;j<=cnt;j++)
{
if(i*p[j]>=N) break;
v[i*p[j]]=true;
if(i%p[j]) phi[i*p[j]]=phi[i]*(p[j]-);
else
{
phi[i*p[j]]=phi[i]*p[j];
break;
}
}
}
int n,m; long long ans;
scanf("%d%d",&n,&m);
ans=;
phifac[]=;
for(int i=;i<=m;i++)
if(!v[i]) phifac[i]=phifac[i-]*(i-)%mod;
else phifac[i]=phifac[i-]*i%mod;
ans=phifac[m];
for(int i=m+;i<=n;i++) ans=ans*i%mod;
printf("%I64d\n",ans-);
}
100分
C
Description
令 f(k)=n 表示 有 n 种方式,可以把正整数 k 表示成几个素数的乘积的形式。
例 10=2*5=5*2,所以 f(10)=2
给出 n,求最小的 k
Input
一行一个整数 n
Output
一行表示答案
Example
四组输入样例
1
2
3
105
对应输出:
2
6
12
720
Hint
20%的数据,k<=20
另外 20%的数据,n<=20
另外 20%的数据,k<=1e6
100%的数据,k,n<=2^60
#include<iostream>
#include<cstdio>
using namespace std;
long long a[];
int k,n,bin[],p[],cnt;
bool vis[];
bool check(int x){
int l=,pos=;
while(x!=){
while(x%p[pos]!=)pos++;
l=l+;
bin[l]=;
while(x%p[pos]==){
bin[l]++;
x=x/p[pos];
}
}
long long res=;
int sum=;
for(int i=;i<=l;i++)sum+=bin[i];
res=a[sum];
for(int i=;i<=l;i++)res/=a[bin[i]];
if(res==n)return ;
return ;
}
int main(){
//freopen("Cola.txt","r",stdin);
freopen("C.in","r",stdin);
freopen("C.out","w",stdout);
a[]=;
for(int i=;i<=;i++)a[i]=a[i-]*i;
scanf("%d",&n);
for(int i=;i<=;i++){
if(!vis[i])p[++cnt]=i;
for(int j=;j<=cnt&&i*p[j]<=;j++){
vis[i*p[j]]=;
if(i%p[j]==)break;
}
}
for(int i=;i<=;i++){//k的所有可能值
if(check(i)){
printf("%d",i);
return ;
}
}
}
30分 暴力枚举答案
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL;
int p[]={,,,,,,,,,,,,,,,,,,,,};
LL ans,n;
LL C[][];
void solve(int num,int lim,LL tot,LL now,int last)
{
if(now>ans) return;
if(tot==n) { ans=now; return ; }
if(tot>n || num>) return;
LL t=;
for(int i=;i<=lim;i++)
{
t*=p[num];
if(now>=ans/t) return;
solve(num+,i,tot*C[last+i][i],now*t,last+i);
}
}
int main()
{
freopen("C.in","r",stdin);
freopen("C.out","w",stdout);
C[][]=;
for(int i=;i<;i++)
{
C[i][]=;
for(int j=;j<=i;j++)
C[i][j]=C[i-][j-]+C[i-][j];
}
scanf("%I64d",&n);
if(n==)
{
printf("1 2\n");
return ;
}
ans=(LL)<<;
solve(,,,,);
printf("%I64d\n",ans);
}
100分 搜索+剪枝
2017-9-22 NOIP模拟赛[xxy][数论]的更多相关文章
- 2018.9.22 NOIP模拟赛
*注意:这套题目应版权方要求,不得公示题面. 从这里开始 Problem A 妹子 Problem B 旅程 Problem C 老大 因为业务水平下滑太严重,去和高一考NOIP模拟,sad... P ...
- 2017.6.11 NOIP模拟赛
题目链接: http://files.cnblogs.com/files/TheRoadToTheGold/2017-6.11NOIP%E6%A8%A1%E6%8B%9F%E8%B5%9B.zip 期 ...
- 2017-9-13 NOIP模拟赛[xxy]
全排列 (permutation.cpp/c/pas)Description从 n 个不同元素中任取 m(m≤n)个元素,按照一定的顺序排列起来,叫做从 n个不同元素中取出 m 个元素的一个排列.当 ...
- 2017 10.25 NOIP模拟赛
期望得分:100+40+100=240 实际得分:50+40+20=110 T1 start取了min没有用,w(゚Д゚)w O(≧口≦)O T3 代码3个bug :数组开小了,一个细节没注意, ...
- 2017.5.27 NOIP模拟赛(hzwer2014-5-16 NOIP模拟赛)
期望得分:100+100+60+30=290 实际得分:100+20+60+0=180 当务之急:提高一次正确率 Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一 ...
- 18.9.22 noip模拟赛
此题为找规律.期望100 实际100 #include<cstdio> #include<cstring> #include<iostream> #include& ...
- 【2019.7.22 NOIP模拟赛 T1】麦克斯韦妖(demon)(质因数分解+DP)
暴力\(DP\) 先考虑暴力\(DP\)该怎么写. 因为每个序列之后是否能加上新的节点只与其结尾有关,因此我们设\(f_i\)为以\(i\)为结尾的最长序列长度. 每次枚举一个前置状态,判断是否合法之 ...
- 5.22 noip模拟赛
本来我是不想写的,无奈不会写.蒟蒻 考场就是想不出来 今天得到了100分额外水过了100分我是真的失败.还有一个根本不会check 感觉自己非常之菜. 这道题是这样的 还行吧比较有意思 首先确立一个真 ...
- 10.16 NOIP模拟赛
目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...
随机推荐
- Feature Selection 其一 —— Filter Approach
这一个部分都将只涉及到选择特征的某个子集的方法,将高纬度的特征空间映射到低维度空间的方法(如PCA)都不会涉及到. 一. 单变量 优点:运算速度快,独立于分类器 缺点:忽略的特征之间的联系,忽略了与分 ...
- linux卸载软件
rpm -q -a 查询当前系统安装的所有软件包 rpm -e 软件包名 参数e的作用是使rpm进入卸载模式,对名为某某某的软件报名进行卸载 rpm -e 软件包名 -nodeps 由于系统中各个软件 ...
- delphi XE7 HttpEncode 编码问题
近期在做网址编码相关的工作,发现在用 XE5 编译的时候,一切正常,拿 到 XE7下 就 结果错误了.百度了下,谷歌 了下,有人提出,但是,我没有找到答案,也许都没有碰到这个问题,也许都己经自己默默的 ...
- 常见的CSS命名
1:header(头部)logo topbar lang search topmenu banner nav headbox active(活动的) selectselectTop selectLi ...
- 郝健: Linux内存管理学习笔记-第1节课【转】
本文转载自:https://blog.csdn.net/juS3Ve/article/details/80035751 摘要 MMU与分页机制 内存区域(内存分ZONE) LinuxBuddy分配算法 ...
- Linux之make的用法讲解
在 Linux环境下使用 GNU 的 make工具能够比较容易的构建一个属于你自己的工程,整个工程的编译只需要一个命令就可以完成编译.连接以至于最后的执行.不过这需要我们投入一些时间去完成一个或者多个 ...
- 分享知识-快乐自己:初识 Hibernate 概念片(一)
1):什么是 Hibernate? Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibe ...
- hdu 4704 sum(费马小定理+快速幂)
题意: 这题意看了很久.. s(k)表示的是把n分成k个正整数的和,有多少种分法. 例如: n=4时, s(1)=1 4 s(2)=3 1,3 3,1 2,2 s ...
- ES搜索排序,文档相关度评分介绍——Field-length norm
Field-length norm How long is the field? The shorter the field, the higher the weight. If a term app ...
- codeforces 705B B. Spider Man(组合游戏)
题目链接: B. Spider Man time limit per test 2 seconds memory limit per test 256 megabytes input standard ...