c++等级考试8级模考

                                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        夺宝大赛

#include<iostream>
#include<map>
#include<queue>
using namespace std;
struct node{
	int xt,yt;
};
int u,v,n,m;
int mp[111][111];
int ct[111][111];
int ans[10000];
int dx[4]={0,-1,0,1};
int dy[4]={-1,0,1,0};
void bfs(int x,int y){
	queue<node>q;
	q.push({x,y});
	while(!q.empty()){
		node n1=q.front();
		q.pop();
		for(int i=0;i<4;i++){
			int xtp=n1.xt+dx[i];
			int ytp=n1.yt+dy[i];
			if(ct[xtp][ytp]||!mp[xtp][ytp]) continue;
			if(xtp<=0||xtp>n||ytp<=0||ytp>m) continue;
		    ct[xtp][ytp]=ct[n1.xt][n1.yt]+1;
		    q.push({xtp,ytp});
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	  for(int j=1;j<=m;j++)
	 {
	 	scanf("%d",&mp[i][j]);
	 	if(mp[i][j]==2){
	 		u=i,v=j;
		 }
	 }
	 bfs(u,v); 
	int k; cin>>k;
	for(int i=1;i<=k;i++){
		int a,b;
		scanf("%d%d",&b,&a);
		if(ct[a][b]){
			if(ans[ct[a][b]]==0) ans[ct[a][b]]=i;
			else ans[ct[a][b]]=-1;
	    }
    }
    int flag=1;
    for(int i=1;i<10000;i++)
    {
    	if(ans[i]>0)
    	{
    		printf("%d %d",ans[i],i);
    		flag=0;
    		break;
		}
	}
	if(flag) printf("No winner.");
	  return 0;
}

                                                                            清点代码库

#include<bits/stdc++.h>
using namespace std;
#define PII pair<int,int>

const int INF = 0x3f3f3f3f;
const int N = 1e4+10;

struct cmp{	//自定义set排序
    bool operator() (const pair<int,vector<int> >&a, const pair<int,vector<int> >&b) const{
        if(a.first!=b.first) return a.first>b.first;
        else return a.second<b.second;
    }
};

int main(){
	int n, m; scanf("%d%d", &n, &m);
	set<vector<int> > st;		//存模块
	map<vector<int>, int> mp;	//存每个模块的个数
	set<pair<int,vector<int> >,cmp > St;//排序
	for ( int i = 0 ; i < n ; i ++ ){
		vector<int> v;
		for ( int j = 0 ; j < m ; j ++ ){
			int x; scanf("%d", &x);
			v.push_back(x);
		}
        mp[v] ++;
        st.insert(v);
	}
	
	printf("%d\n", st.size());
	//把所有模块存入ST排序 
	set<vector<int> >::iterator it;
    for(it = st.begin() ; it != st.end() ; it ++)
    	St.insert({mp[*it],*it});
	//输出ST 
	set<pair<int,vector<int> > >::iterator ite;
    for(ite = St.begin() ; ite != St.end() ; ite ++){
    	cout << (*ite).first;
        for(int i = 0; i < (*ite).second.size() ; i++)
            cout<<' '<<(*ite).second[i];
        cout<<endl;
	}
	return 0;
}

                                                                        逆散列问题

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int m;
int main()
{
	cin >> m;
	vector<int>v(m);
	vector<int>temp;
	for (int i = 0; i < m; i++)
	{
		cin >> v[i];
		if (v[i] != -1)
			temp.push_back(v[i]);
	}
	sort(temp.begin(), temp.end());
	int length = temp.size();
	vector<bool>finding_value(length, 0);
	vector<bool>hashtable(m, 0);
	int num = 0, index = 0;
	//length 为插入数据长度
	while (num != length)
	{
		for (int i = 0; i < length; i++)
		{
			if (!finding_value[i]) //如果这个值没有找到位置
			{
				int posi = temp[i] % m;
				//temp[i]的线性探测初始位置
				if (v[posi] == temp[i])
				{
					printf("%d ", temp[i]);
					finding_value[i] = 1;
					hashtable[posi] = 1;
					num++;
					break;
				}
				else
				{
					for (int t = 0; t < m; t++)
					{
						int new_posi = (posi + t) % m;
						if (hashtable[new_posi])
							continue;
						if (!hashtable[new_posi] && v[new_posi] != temp[i])
							break;
						finding_value[i] = hashtable[new_posi] = 1;
						printf("%d ", temp[i]);
						num++;
						break;
					}
				}
			}
		}
	}
}

                                                                   可怜的简单题

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int Lim=2.2e7, MAXN=Lim+10;
ll n, p;
inline ll fmul(ll a,ll x) { return (__int128)a*x%p; }
inline ll fpow(ll a,ll x) { ll ans=1; for(;x;x>>=1,a=fmul(a, a) ) if(x&1) ans=fmul(ans, a); return ans; }
inline ll inv(ll a) { return fpow(a, p-2); }

ll smu[MAXN];
int prime[MAXN],  cntprime;
bool nprime[MAXN];
unordered_map<ll, ll>  M;
inline ll summu(ll n){
    if(n<=Lim) return smu[n];
    if(M.count(n)) return M[n];
    for(ll r=n, l, d;r>=1; r=l-1){
        d=n/r;
        l=n/(d+1)+1;
        if(d<=Lim||M.count(d)) continue;
        ll tmp=1;
        for(ll ll=2, rr, dd;ll<=d;ll=rr+1){
            dd=d/ll;
            rr=d/dd;
            if(dd<=Lim) tmp-=fmul(rr-ll+1, smu[dd]);
            else tmp-=fmul(rr-ll+1, M[dd]);
        }
        M[d]=(tmp%p+p)%p;
    }
    return M[n];
}
inline void sieve(){
    smu[1]=1;
    for(int i=2;i<=Lim;++i){
        if(!nprime[i]) prime[++cntprime]=i, smu[i]=-1;
        for(int j=1;j<=cntprime;++j)
            if(i*prime[j]>Lim) break;
            else if(i%prime[j]){
                nprime[i*prime[j]]=1;
                smu[i*prime[j]]=-smu[i];
            }
            else{
                nprime[i*prime[j]]=1;
                smu[i*prime[j]]=0;
                break;
            }
    }
    for(int i=2;i<=Lim;++i){
        smu[i]+=smu[i-1];
        if(smu[i]>=p) smu[i]-=p;
        else if(smu[i]<0) smu[i]+=p;
    }
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin>>n>>p;
    sieve();
    ll ans=0;
    summu(n);
    for(ll l=2, r, d, tmp=n%p;l<=n;l=r+1){
        d=n/l;
        r=n/d;
        ans+=fmul( summu(r)-summu(l-1) , inv(d-tmp+p) );
    }
    ans=(ans%p+p)%p;
    ans=( fmul(ans, n)+summu(n)+p )%p;
    cout<<ans;
    cout.flush();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值