https://ac.nowcoder.com/acm/contest/3282
斐波那契【矩阵快速幂】
前n项的平方和==a(n)*a(n+1)
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=15;
const int mod=1e9+7;
struct node{
LL a[N][N];}a,ans;
int f[15]={
0,1};
node mul1(node a,node b,LL p)
{
node c={
0};
for(int i=1;i<=1;i++)
for(int k=1;k<=2;k++)
for(int j=1;j<=2;j++)
c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%p;
return c;
}
node mul2(node a,node b,LL p)
{
node c={
0};
for(int i=1;i<=2;i++)
for(int k=1;k<=2;k++)
for(int j=1;j<=2;j++)
c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%p;
return c;
}
node qsm(node a,LL b,LL p)
{
node sum={
0};
sum.a[1][1]=1,sum.a[1][2]=1;
while(b)
{
if(b&1) sum=mul1(sum,a,p);
b>>=1;
a=mul2(a,a,p);
}
return sum;
}
int main(void)
{
LL n; cin>>n;
a.a[1][1]=1,a.a[1][2]=1;
a.a[2][1]=1,a.a[2][2]=0;
if(n==1) puts("1");
else
{
ans=qsm(a,n-1,mod);
cout<<(ans.a[1][1]*ans.a[1][2])%mod<<'\n';
}
return 0;
}
最大边长【二分】
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e6+10;
const int mod=1e9+7;
LL a,b;
bool check(LL x)
{
LL sum;
sum=(a/x)*(b/x);
return sum>=3;
}
int main(void)
{
cin>>a>>b;
LL l=1,r=1e18;
while(l<r)
{
LL mid=(l+r+1)/2;
if(check(mid)) l=mid;
else r=mid-1;
}
if(check(l)) cout<<l;
else cout<<0;
return 0;
}
3的倍数【二进制枚举】
#include<bits/stdc++.h>
using namespace std;
int n;
vector< vector<int> >ve;
int main(void)
{
cin>>n;
for(int i=0;i<n;i++)
{
string s; cin>>s;
int cnt[35]={
0};
vector<int>temp;
for(int j=0;j<s.size();j++) cnt[s[j]-'A']++;
for(int j=0;j<26;j++) temp.push_back(cnt[j]);
ve.push_back(temp);
}
int ans=0;
for(int i=0;i<(1<<n);i++)
{
int w[35]={
0},cnt=0,flag=1;
for(int j=0;j<n;j++)
{
if(i>>j&1)
{
cnt++;
for(int k=0;k<ve[j].size();k++) w[k]+=ve[j][k];
}
}
for(int j=0;j<26;j++) if(w[j]%3!=0) flag=0;
if(flag) ans=max(ans,cnt);
}
cout<<ans;
return 0;
}
进制转换【高精度】
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
int m,n,res;
string s;
vector<int>A,C;
int get(char s)
{
if(s<='9') return s-'0';
else return s+10-'a';
}
vector<int> div(vector<int> A,int b,LL &res)
{
vector<int>C;
for(int i=A.size()-1;i>=0;i--)
{
res=res*m+A[i];
C.push_back(res/b);
res=res%b;
}
reverse(C.begin(),C.end());
while(C.size()&&C.back()==0) C.pop_back();
return C;
}
int main(void)
{
cin>>s;
cin>>m>>n;
for(int i=s.size()-1;i>=0;i--) A.push_back(get(s[i]));
while(A.size())
{
LL res=0;
A=div(A,n,res);
C.push_back(res);
}
for(int i=C.size()-1;i>=0;i--)
if(C[i]<10) cout<<C[i];
else printf("%c",C[i]-10+'a');
}
好点【排序】
#include<bits/stdc++.h>
using namespace std;
int n;
vector< pair<int,int> >ve,ans;
int main(void)
{
cin>>n;
for(int i=0;i<n;i++)
{
int x,y; cin>>x>>y;
ve.push_back({
x,y});
}
sort(ve.begin(),ve.end());
int h=-1e9-10;
for(int i=ve.size()-1;i>=0;i--)
{
if(ve[i].second>=h) ans.push_back(ve[i]);
h=max(h,ve[i].second);
}
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++) cout<<ans[i].first<<" "<<ans[i].second<<'\n';
return 0;
}
小小小马【找规律】
#include<bits/stdc++.h>
using namespace std;
int n,m,st[1010][1010];
int dx[8]={
-2,-2,-1,-1,1,1,2,2};
int dy[8]={
-1,1,-2,2,-2,2,-1,1};
bool check()
{
queue< pair<int,int> >q; q.push({
1,1});
st[1][1]=1;
while(q.size())
{
auto temp=q.front(); q.pop();
int x=temp.first,y=temp.second;
for(int i=0;i<8;i++)
{
int tempx=x+dx[i],tempy=y+dy[i];
if(tempx<=0||tempx>n||tempy<=0||tempy>m) continue;
if(st[tempx][tempy]) continue;
st[tempx][tempy]=1;
q.push({
tempx,tempy});
}
}
int cnt=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) if(st[i][j]) cnt++;
return cnt==n*m;
}
int main(void)
{
cin>>n>>m;
//if(check()) puts("YES");
//else puts("NO");
if(n==3&&m==3)
{
puts("No");
return 0;
}
if((n==1&&m==1)||(n>=3&&m>=3)) puts("Yes");
else puts("No");
return 0;
}
//1 1 y
//1 2 N
//2 1 N
//2 2 N
//2 3 N
//3 2 N
//3 3 N
//3 4 Y
//4 3 Y
//4 4 Y
//4 5 Y
//5 4 Y
//5 5 Y
//5 6 Y
//6 5 Y
//6 6 Y
//
Hello World【签到】
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
puts("I Love nowcoder");
return 0;
}