就把做过的题全贴上来把!大概有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减小
所以我们求两组边界情况即可!