2017-9-22 NOIP模拟赛[xxy][数论]
XXY 的 的 NOIP 模擬賽 4 4 —— 數(shù)學(xué)專場(chǎng)
A
Description
定義 f(x)表示 x 的約數(shù)和,例:f(12)=1+2+3+4+6+12=28
給出 x,y,求Σf(i),i∈[x,y]
Input
一行兩個(gè)整數(shù) x,y
Output
一行表示答案
Example
兩組輸入數(shù)據(jù)
2 4
123 321
對(duì)應(yīng)輸出
14
72543
Hint
對(duì)于 20%的數(shù)據(jù),1<=x<=y<=1000
對(duì)于 40%的數(shù)據(jù),1<=x<=y<=1e7
對(duì)于 100%的數(shù)據(jù),1<=x<=y<=2e9
?
B
Description
求滿足以下條件的 x 的個(gè)數(shù)
① x∈[1,n!]
② 設(shè) pi 為質(zhì)數(shù)且 pi|x,那么 pi>m,對(duì)于所有的 pi 均成立
答案對(duì) 100000007 取模
Input
一行兩個(gè)整數(shù) n,m
Output
一行表示答案
Example
3 組輸入樣例
100 10
100 20
10000 9000
Output
對(duì)應(yīng) 3 組輸出
43274465
70342844
39714141
Hint
對(duì)于 20%的數(shù)據(jù),n,m<=8
對(duì)于 60%的數(shù)據(jù),n<=100000,m<=8
對(duì)于 100%的數(shù)據(jù),n<=10000000,保證 n-m<=100000,m<=n
學(xué)到的一點(diǎn)東西
1.x的所有素因子大于m,則x與m!互素
2.已知phi[(i-1)!],遞推地求phi[i!]
如果i是素?cái)?shù),phi[i!]=phi[(i-1)!]*(i-1)
如果i不是素?cái)?shù),phi[i!]=phi[(i-1)!]*i
3.phi[n!]=phi[m!]*(n!/m!)
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int p[10000],n,m,w=1,ans,cnt; bool vis[10000000],q[1000000]; void dfs(int pos,long long sum){if(sum>w)return;if(!q[sum]&&sum!=1)ans++,q[sum]=1;//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=1;i<=n;i++)w*=i;for(int i=2;i<=w;i++){if(!vis[i])p[++cnt]=i;for(int j=1;j<=cnt&&i*p[j]<=w;j++){vis[i*p[j]]=1;if(i%p[j]==0)break;}}int pos=upper_bound(p+1,p+cnt+1,m)-p;dfs(pos,1);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[664580],phi[N]; long long phifac[N]; bool v[N]; int main() {freopen("B.in","r",stdin);freopen("B.out","w",stdout);phi[1]=1;for(int i=2;i<N;i++){if(!v[i]){p[++cnt]=i;phi[i]=i-1;}for(int j=1;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]-1);else{phi[i*p[j]]=phi[i]*p[j];break;}}}int n,m; long long ans;scanf("%d%d",&n,&m);ans=0;phifac[1]=1;for(int i=2;i<=m;i++) if(!v[i]) phifac[i]=phifac[i-1]*(i-1)%mod;else phifac[i]=phifac[i-1]*i%mod;ans=phifac[m];for(int i=m+1;i<=n;i++) ans=ans*i%mod;printf("%I64d\n",ans-1); } 100分?
C
Description
令 f(k)=n 表示 有 n 種方式,可以把正整數(shù) k 表示成幾個(gè)素?cái)?shù)的乘積的形式。
例 10=2*5=5*2,所以 f(10)=2
給出 n,求最小的 k
Input
一行一個(gè)整數(shù) n
Output
一行表示答案
Example
四組輸入樣例
1
2
3
105
對(duì)應(yīng)輸出:
2
6
12
720
Hint
20%的數(shù)據(jù),k<=20
另外 20%的數(shù)據(jù),n<=20
另外 20%的數(shù)據(jù),k<=1e6
100%的數(shù)據(jù),k,n<=2^60
?
轉(zhuǎn)載于:https://www.cnblogs.com/thmyl/p/7574982.html
總結(jié)
以上是生活随笔為你收集整理的2017-9-22 NOIP模拟赛[xxy][数论]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 广域网 —— 广域网的基本概念
- 下一篇: systemd.timer定时任务