https://codeforces.com/contest/1228/problem/D
B 考虑哪些位置是连续黑的后的第一个间断位置 不能放 -1
先按行放完 1 边界为-1
再按列放时考虑 现在该放1连续的地方之前为-1边界 不可能
在现在边界该放-1的位置 之前放的是1 不可能
所有未被访问的位置 可放可不放
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
typedef long long ll;
typedef pair<ll,ll> pll;
const int maxn=1e5+5;
const int INF=0x3f3f3f3f;
const ll inf=0x3f3f3f3f3f3f3f3f;
const ll mod=1e9+7;
ll n,m,k,cnt,tmp,res,T,maxx,ans;
ll r[maxn],c[maxn],vis[1005][1005];
string s;
int main(){
cin>>n>>m;
rep(i,1,n){
cin>>r[i];
}
rep(i,1,m){
cin>>c[i];
}
rep(i,1,n){
rep(j,1,r[i]){
vis[i][j]=1;
}
vis[i][r[i]+1]=-1;
}
rep(i,1,m){
rep(j,1,c[i]){
if(vis[j][i]==-1)
return cout<<0<<endl,0;
vis[j][i]=1;
}
if(vis[c[i]+1][i]==1)
return cout<<0<<endl,0;
vis[c[i]+1][i]=-1;
}
ans=1;
rep(i,1,n){
rep(j,1,m){
if(!vis[i][j]){
ans=ans*2%mod;
}
}
}
cout<<ans<<endl;
return 0;
}
C 质因子 1e18内的数质因子不超过20个
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
#define pb push_back
typedef long long ll;
const ll mod=1e9+7;
ll x,n,ans=1;
vector<ll> v;
ll pow_mod(ll a,ll b,ll mod)
{
ll res=1;
while(b){
if(b&1){
res=res*a%mod;
}
a=a*a%mod;
b>>=1;
}
return res;
}
int main(){
cin>>x>>n;
for(int i=2;i*i<=x;i++){
if(x%i==0){
v.pb(i);
x=x/i;
while(x%i==0){
x=x/i;
}
}
}
if(x!=1)
v.pb(x);
ll len=v.size();
for(int i=0;i<len;i++){
ll now=v[i],tmp=n;
while(tmp>0){
ll cnt=tmp/now;
ans=ans*pow_mod(now,cnt,mod)%mod;
tmp=tmp/now;
}
}
cout<<ans%mod<<endl;
return 0;
}
D
在这里插入代码片