找规律专题

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;
} 
posted @ 2022-05-01 16:05  wzx_believer  阅读(23)  评论(0编辑  收藏  举报