前言:
补上一周的训练。
正文:
Problem:A昨日重现:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int n;
while(cin>>n){
ll ans=((168*(n%1007)*((n+1)%1007)%1007)*((2*n+1)%1007))%1007;
cout<<ans<<endl;
}
return 0;
}
本题要用到逆元的思想(1/6对1007的逆元是168),我们就可以在把公式换成1/6*n*(n-1)*(2n+1)对1007取余,求逆元用到了exgcd的算法。
求逆元代码如下:
int exgcd(int a,int b,int &x,int &y){
if(b==0){
x=1;
y=0;
return 0;
}
int gcd=exgcd(b,a%b,x,y);
int tmp=x;
x=y;
y=tmp-(a/b)*y;
return gcd;
}
Problem:B库特的素数队列(1):
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+5,maxn=1e7;
int prime[N];
int init(){
memset(prime,1,sizeof(prime));
prime[0]=prime[1]=0;
for(int i=2;i<=maxn;i++){
for(int j=2;j*i<=maxn;j++){
prime[i*j]=0;
}
}
return 0;
}
queue<int> q;
int main(){
init();
int t,n;
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++){
q.push(i);
}
while(q.size()!=1){
int sz=q.size();
for(int i=1;i<=sz;i++){
if(prime[i])q.push(q.front());
q.pop();
}
}
cout<<q.front()<<endl;
q.pop();
}
return 0;
}
用队列模拟报数过程,用线性筛求解素数,最终得结果。
Problem:C库特选数:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N];
int main(){
int n,m,x;
while(cin>>n>>m){
int flag=0;
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++){
cin>>x;
a[x]++;
}
if(m){
for(int i=1;i<=1000000;i++)
if(m%i==0&&a[i]){
int tmp=m/i;
if(tmp>1e6)continue;
if(tmp==i)
if(a[tmp]>=2)flag=0;
if(tmp!=i)
if(a[tmp]>=1)
flag=true;
}
}
else if(a[0])flag = 1;
if(flag) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}
用桶排序来处理数,有效减少了查询数组的时间。
Problem:D库特删数:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
while(cin>>n){
int a,x=0,y=0;
for(int i=1;i<=n;i++){
cin>>a;
if(a%2==0)y++;
else x++;
}
if((y==0&&x%2!=0)||(y==1&&x>=2)||(y>1&&x>=1))cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}
先找出输入数据中偶数和奇数的个数,根据个数来判断能否和为偶数(偶数不会影响总和的奇偶性,只有奇数会)
Problem:E最左边的数:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int t,n;
cin>>t;
while(t--){
cin>>n;
double x=n*log10(n);
int ans=(int)pow(10.0,x-(ll)x);
cout<<ans<<endl;
}
return 0;
}
数学题
n^n的位数:k = [lg(n^n)] + 1 = [n * lg(n)]
最左边的数作个位:x = n^n / 10^(k-1)
取对数:lg(x) = n * lg(n) - (k-1) = (n*lg(n) - [n*lg(n)])
最左边的数:[x] = [10^lg(x)] = [10^(n*lg(n) - [n*lg(n)])]
后记:
这次训练的题到此就补完了!!!