训练记录day13 (想起来今天还没发博客

就把做过的题全贴上来把!大概有9题左右?

P2197 【模板】nim 游戏

#include <bits/stdc++.h>
using namespace std;
const int N = 1e4+10;
const int M = 1e4+10;
const int mod = 19260817;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
signed main(){
    fast
    int t;cin>>t;
    while(t--){
        int n,sum=0;cin>>n;
        while(n--){int x;cin>>x;sum^=x;}
        if(sum)cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
    return 0^0;
}

 

P2613 【模板】有理数取余

感觉一眼乘法逆元+快速幂 因为m是个质数 可是还是学了一下证明

#include <bits/stdc++.h>
using namespace std;
const int N = 1e8+10;
const int M = 1e4+10;
const int mod = 19260817;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
void read(long long &x){
    int f=1;x=0;char s=getchar();
    while(s>'9'||s<'0'){if(s=='-')f=-1;s=getchar();}
    while(s<='9'&&s>='0'){x=x*10%mod+(s-'0')%mod;s=getchar();}
    x=x%mod*f;
}
int qmi(int a,int k, int p){
    int res=1;
    while(k){
        if(k&1)res=res*a%p;
        a=a*a%p;
        k>>=1;
    }
    return res;
}
signed main(){
    fast
    int a,b;
    read(a), read(b);
    if(!b)cout<<"Angry!"<<Endl;
    else cout<<a*qmi(b,mod-2,mod)%mod<<endl;
    return 0^0;
}

 

P4549 【模板】裴蜀定理

#include <bits/stdc++.h>
using namespace std;
const int N = 1e8+10;
const int M = 1e4+10;
const int mod = 1e9+7;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int gcd(int a,int b){return b?gcd(b,a%b):a;}
signed main(){
    fast
    int n;cin>>n;
    int a[22];
    for(int i=0;i<n;i++)cin>>a[i];
    int t=0;
    for(int i=0;i<n;i++){
        t=gcd(a[i],t);
    }
    cout<<abs(t)<<endl;
    return 0^0;
}

 

P3383 【模板】线性筛素数

#include <bits/stdc++.h>
using namespace std;
const int N = 1e8+10;
const int M = 1e4+10;
const int mod = 1e9+7;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int prime[N];
bool st[N];
signed main(){
    fast
    int n,m,cnt=1;cin>>n>>m;
    for(int i=2;i<=n;i++){
        if(!st[i])prime[cnt++]=i;
        for(int j=1;prime[j]<=n/i;j++){
            st[i*prime[j]]=true;
            if(i%prime[j]==0)break;
        }
    }
    while(m--){
        int x;cin>>x;
        cout<<prime[x]<<endl;
    }
    return 0^0;
}

 

 892. 台阶-Nim游戏

筛单数^

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n;cin>>n;
    int flag=0;
    for(int i=1;i<=n;i++){
        int x;cin>>x;
        if(i%2)flag^=x;
    }
    if(flag)cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
    return 0;
}

 893. 集合-Nim游戏

 sg图+记忆化搜索

#include <bits/stdc++.h>
using namespace std;
const int N = 1e4+10;
const int M = 1e4+10;
const int mod = 19260817;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int s[N],f[N],n,m;
int sg(int x){
    if(f[x]!=-1)return f[x];
    set<int>S;
    for(int i=1;i<=m;i++)if(x>=s[i])S.insert(sg(x-s[i]));
    for(int i=0;;i++)if(!S.count(i))return f[x]=i;
}
signed main(){
    fast
    cin>>m;
    for(int i=1;i<=m;i++)cin>>s[i];
    cin>>n;
    int ans=0;
    memset(f,-1,sizeof f);
    for(int i=1;i<=n;i++){
        int x;cin>>x;
        ans^=sg(x);
    }
    if(ans)cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
    return 0^0;
}

 

894. 拆分-Nim游戏

sg图+记忆化搜索

#include<bits/stdc++.h>
using namespace std;
const int N =110;
int f[N];
int sg(int x){
    if(f[x]!=-1)return f[x];
    set<int>s;
    for(int i=0;i<x;i++){
        for(int j=0;j<=i;j++){
            s.insert(sg(i)^sg(j));
        }
    }
    for(int i=0;;i++){
        if(s.count(i)==0)return f[x]=i;
    }
}
int main(){
    int n;cin>>n;
    int ans=0;
    memset(f,-1,sizeof f);
    for(int i=0;i<n;i++){
        int x;cin>>x;
        ans^=sg(x);
    }
    if(ans)cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
    return 0;
}

 890. 能被整除的数

容斥但是通过位运算+spj 就是t>n时 就不能算进去了

#include <bits/stdc++.h>
using namespace std;
const int N = 1e8+10;
const int M = 1e4+10;
const int mod = 19260817;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);

signed main(){
    fast
    int n,m,a[20];cin>>n>>m;
    for(int i=0;i<m;i++)cin>>a[i];
    int ans=0;
    for(int i=1;i<1<<m;i++){
        int t=1,cnt=0;
        for(int j=m-1;j>=0;j--){
            if(i>>j&1){
                if((long long)t*a[j]>n){
                    t=-1;
                    break;
                }
                t*=a[j];
                cnt++;
            }
        }
        if(t!=-1){
            if(cnt%2)ans+=n/t;
            else ans-=n/t;
        }
    }
    cout<<ans<<endl;
    return 0^0;
}

 

P5656 【模板】二元一次不定方程 (exgcd)

重点来证明一下这道题啊!

首先 ax+by=c;

要是有解肯定是(a,b)|c

第一个问题解除 所以我们可以再exgcd的时候 求出 (a,b)的同时 求出 一组x,y的特解

当我们有这一组特解的同时 我们知道

ax+by=c;

可以变形为

a(x+db)+b(y-da)=c;

显然成立

而db和da要为整数 那么d|a,d|b 那么d=(a,b)

最后我们知道当x增大时 y减小

所以我们求两组边界情况即可!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值