[蓝桥杯][2013年第四届真题]幸运数

    科技2022-07-10  105

    题目链接:幸运数

    解题思路:用STL的vector模拟就可以,具体看代码注释

    #include<bits/stdc++.h> #define x first #define y second #define mem(h) memset(h,-1,sizeof h) #define mcp(a,b) memcpy(a,b,sizeof b) using namespace std; typedef long long LL; typedef unsigned long long ull; typedef pair<int,int>PII; typedef pair<double,double>PDD; namespace IO{ inline LL read(){ LL o=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){o=o*10+c-'0';c=getchar();} return o*f; } }using namespace IO; //#############以上是自定义技巧(可忽略)########## const int N=1e3+7,M=2e3+7,INF=0x3f3f3f3f,mod=1e9+7,P=131; bool st[11],bk[11]; vector<int>a; int n,m; void del(int i){//删除i位置上的数的整除项 int v=a[i],j=a[i];//v是当前i位置上的数,表示每次的增量,j是开始的位置 while(j<a.size())j+=v;//先把j移动到最后的位置 for(j-=v;j>=v;j-=v){//真实的位置在j-v a.erase(a.begin()+j);//把j位置的数删除 } } int main(){ cin>>m>>n; for(int i=0;i<n;i++){//因为下标从1开始,不包含n a.push_back(i); } del(2);//因为从1是第一个幸运数,直接从2开始,先把2的整除项删除 for(int i=2;i<a.size();i++){ del(i);//再删除第二个位置上的数的整除项 } int ans=0; for(int i=0;i<a.size();i++){ if(a[i]>m)ans++;//剩下的每一项中,大于m的有多少 } cout<<ans<<endl; return 0; }
    Processed: 0.040, SQL: 8