夺宝大赛
#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;
}