补题*总结题21/8/25
总结
data不能用于bool数组变量名字,提交oj可能会报错...(求心里阴影面积)
全排列函数:next_permutation(s.begin(), s.end());
C - Coprime 2
AtCoder abc215_d
题意:
给出n个数,在[1,m]范围那找出与这n个数都互质的数。
思路1:
直接暴力,结果不出所料
时间复杂度O(n* m),直接超时
代码:
展开源码
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a% b); } int main() { int i,j; int n,m; cin>>n>>m; int a[100001]; for(i=0; i>a[i]; int data[100001]; long long int o=0; long long int sum; o=0; for(j=1; j<=m; j++) { if(gcd(j,a[0])==1) { data[o]=j; o++; } } sum=o; for(i=1; i< n ; i++) { for(j=0; j < o; j++) { if( data[j]!=-1) { if( gcd(data[j],a[i])!=1 ) { data[j]=-1; sum--; } } } } cout<< sum << endl; for(i=0 ; i< o; i++) { if(data[i]!=-1) cout<< data[i]<< endl; } return 0; }
思路2
做数组data[m],其中data[j]=0代表数j符合题意,data[j]=1代表不符合题意。
判断a[i]是否为质数,如果是质数则把1~m之间的a[i]的倍数赋值为1;
若不为质数,则把a[i]的质因数,在1~m之间的倍数赋值为1
代码:
**#include <bits/stdc++.h> using namespace std; int main() { int i,j; int n,m; cin>>n>>m; int a[100001]; for(i=0; i<n; i++) cin>>a[i]; int data[100001]= {0}; int sum=m; int flag=0; int k; for(i=0; i<n; i++) { flag=0;//默认是质数 if(a[i]==1){flag=1;} else if(a[i]==2||a[i]==3) { flag=0; } else { for(j=2; j*j<=a[i]; j++) { if(a[i]%j==0) { flag=1; for(k=1;j*k<=m;k++) { if(data[k*j]!=1) {data[k*j]=1; sum--;} } for(k=1;(a[i]/j)*k<=m;k++) { if(data[k*(a[i]/j)]!=1) {data[k*(a[i]/j)]=1; sum--;} } } } } if(flag==0) { for(k=1;a[i]*k<=m;k++) { if( data[ a[i]*k ]!=1) {data[ a[i]*k ]=1; sum--; } } } } cout<<sum<<endl; for(i=1; i<=m; i++) { if(data[i]==0) cout<<i<<endl; } return 0; } **
结果还是超时,但是比暴力快,继续优化。
思路3
思路2超时,应该是因为有公共质因数,重复给data[j]赋值导致,尝试在原函数上修改无果后,开启思路三
可以先把质因数找好标记上 ,然后,那么将不互质的数剔除。
代码:
#include<bits/stdc++.h> using namespace std; int ans[1000001]; bool ok[1000001]; //记录质因数 int check(int a) { if(ok[a]==true)//如果i是质因数 { return false; } for(int i=2; i*i<=a; i++) { if(a%i==0&&(ok[i]==true||ok[a/i]==true)) return false; } return true; } int main() { //下面是输入 int n,m; cin>>n>>m; int p; for(int i=1; i<=n; i++) { cin>>p; //获取p的质因数 for(int j=1; j*j<=p; j++) { if(p%j==0) { ok[j]=ok[p/j]=true; } } //获取p的质因数 } int len=0; for(int i=2; i<=m; i++) { if(check(i)) { len++; ans[len]=i; } } cout<<len+1<<endl<<1<<endl; for(int i=1; i<=len; i++) cout<<ans[i]<<endl; return 0; }
B - One More aab aba baa
题意:给一个字符串,求该字符串按字典从小到大排序第K个串是什么
思路:
排序,找到按字典排序最小的串,全排列K次
代码:
#include <bits/stdc++.h> using namespace std; int main() { string s; int k; cin >> s >> k; sort(s.begin(), s.end()); for (int i = 0; i < k - 1; ++i) next_permutation(s.begin(), s.end()); cout << s << '\n'; return 0; }
log2(N)
AtCoder abc215_b
题意:求log2(N)
疑问
- -不知道为什么直接log(n)/log(2);到后面会Wrong Answer
代码:
#include <bits/stdc++.h> using namespace std; int main() { long long n; cin>>n; int i; long long t=1; for(i=0;i<=100;i++) { t*=2; if(t>n) { break; } } cout<<i<<endl; return 0; }
本文作者:kingwzun
本文链接:https://www.cnblogs.com/kingwz/p/15186708.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步