找规律专题
https://www.luogu.com.cn/problem/P1984
当时一直在推 发现根本就推不出来 发现别人都是直接上OEIS 学到了
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<b;i++)
typedef long long ll;
const int mod=998244353;
const int maxn=3e5;
ll pow_mod(ll base,int n,int mod){
ll ans=1;
while(n){
if(n&1)ans=(ans*base)%mod;
base=(base*base)%mod;
n>>=1;
}
return ans%mod;
}
ll F[maxn*2],inv[maxn];
void init(){
rep(i,1,maxn)inv[i]=pow_mod(i,mod-2,mod);
F[0]=1;for(int i=1;i<maxn*2;i++)F[i]=F[i-1]*i%mod;
}
ll C(int n,int k){
ll ans=(F[k]*F[n-k])%mod;
ans=pow_mod(ans,mod-2,mod);
return (ans*F[n])%mod;
}
ll Lucas(int n,int m){
return m==0?1:(C(n%mod,m%mod)*Lucas(n/mod,m/mod))%mod;
}
//end
//a(n) = sum (k = 0..n, C(n+k, n)*C(n, k)/(k+1)).
int main(){
init();
int n;
scanf("%d",&n);
n--;
ll ans=0;
rep(k,0,n+1) ans=(ans+Lucas(n+k,n)*Lucas(n,k)%mod*inv[k+1]%mod)%mod;
printf("%lld\n",ans);
return 0;
}
直觉告诉我们 这道题和奇偶性有关
首先发现 答案只有可能是n×m 或者n×m+1 并且只要n和m有一个为偶数 就一定只是n×m
再找可以跨越的点 首先想到和(1,1)产生联系的点 这个相对好找一些 真的得耐下性子来找 比的就是谁更耐性
最后发现
这些点与(1,1)连接的话 可以使得答案减一 但是要是其他点相连呢 大胆猜测 只要是这些点就行 不然真心没法模拟
大胆猜测!!!!
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n, m, k;
int t;
cin >> t;
while (t--)
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
int flag=0;
for(int i=0; i<k; i++)
{
int x1,x2,y1,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(x1==x2&&y1==y2)
continue;
if(x1%2==1&&y1%2==1&&x2%2==1&&y2%2==1) flag=1;
if(x1%2==0&&y1%2==0&&x2%2==1&&y2%2==1) flag=1;
if(x1%2==0&&y1%2==0&&x2%2==0&&y2%2==0) flag=1;
if(x1%2==1&&y1%2==1&&x2%2==0&&y2%2==0) flag=1;
}
if(n%2==0||m%2==0||flag==1)
printf("%d\n",n*m);
else
printf("%d\n",n*m+1);
}
}
这是一道训练比赛技巧的很好的一道题
如果一个点的值是一个质数 那么只要其他点和该点连接一定是价值最小的 n-1
但是怎么才能确保至少含有一个素数呢?
小数据我们肯定是可以暴力的 这个题典型可以打表 !!!
发现n大于1000的 一定都只会出现n-1
n小于1000的 为了更大的缩小可能出现的差错 可以取5000 直接暴力克鲁斯卡尔
但是有一种情况 !!!L=R时 每条边都是L 答案就是L×(n-1)
证明的话我觉得很牵强 不过还是有道理
https://ac.nowcoder.com/acm/contest/32708/K
#include<bits/stdc++.h>
using namespace std;
int T,n,a,b;
int main(){
cin>>T;
while(T--){
cin>>n>>a>>b;
cout<<1+1ll*(n-1)*a/b<<endl;
}
return 0;
}