样例输入1 1 20 样例输入2 30 69
样例输出1 5 样例输出2 8
#include<bits/stdc++.h> using namespace std; typedef long long LL; #define INF 99999999 #define me(a,x) memset(a,x,sizeof(a)) int mon1[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31}; int mon2[13]= {0,31,29,31,30,31,30,31,31,30,31,30,31}; int dir[4][2]= {{0,1},{0,-1},{1,0},{-1,0}}; int fac[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880};//i的阶乘 LL getval() { LL ret(0); char c; while((c=getchar())==‘ ‘||c==‘\n‘||c==‘\r‘); ret=c-‘0‘; while((c=getchar())!=‘ ‘&&c!=‘\n‘&&c!=‘\r‘) ret=ret*10+c-‘0‘; return ret; } void out(int a) { if(a>9) out(a/10); putchar(a%10+‘0‘); } int kt(int a[],int n)//康托展开 { int ans=0; for(int i=1; i<=n; i++) //下标从1开始 { int c=0; for(int j=i+1; j<=n; j++) { if(a[j]<a[i]) c++; } ans+=(c*fac[n-i]); } return ans+1; } #define max_v 1000005 int a[max_v]; int vis[max_v]; void f(int k,int n)//消去序号%k==0的数 { int c=0; for(int i=1;i<=n;i++) { if(a[i]==0) continue; c++; if(c%k==0) { a[i]=0; } } } int ff(int k,int n)//输出序列中第k个数是多少 { int c=0; for(int i=1;i<=n;i++) { if(a[i]!=0) c++; if(c==k) { return a[i]; } } return -1; } int main() { int m,n; scanf("%d %d",&m,&n); me(vis,0); for(int i=1;i<=n;i++) a[i]=i; int k=2; int v=2; while(v<=n) { f(v,n); v=ff(k,n); if(v==-1) break; vis[v]=1; k++; } int c=0; for(int i=m+1;i<=n-1;i++) { if(vis[i]) c++; } printf("%d\n",c); return 0; } /* a[i]=i代表i在序列中 a[i]=0代表i不在序列中 */
原文:https://www.cnblogs.com/yinbiao/p/10073423.html