牛客小白月赛9 A B J

版权声明:存在错误或者不清楚的地方还望指出 https://blog.csdn.net/hypHuangYanPing/article/details/84197201
/**
A	签到
链接:https://ac.nowcoder.com/acm/contest/275/A
ans:1-都没有扔下来的概率; 处理逆元取模即可
*/

#include<bits/stdc++.h>
#define  ll long long
using namespace std;

const int mod=1e9+7;

ll ksm(ll a,ll b){
	ll ans=1;
	while(b){
		if(b&1) ans=ans*a%mod;
		b>>=1;
		a=a*a%mod;
	}
	return ans;
}

int main (){
	int n;scanf("%d",&n);
	ll p=1,q=1;
	for(int i=0;i<n;i++){
		int a,b;scanf("%d %d",&a,&b);
		p=p*1ll*(b-a)%mod;
		q=q*1ll*ksm(b*1ll,mod-2)%mod;
	}
	cout<<(1-p*q%mod+mod)%mod<<endl;
	return 0;
}
/**
B	法法
链接:https://ac.nowcoder.com/acm/contest/275/B
题意:如中文题面;
分析:对每个数字都存在*A(n-1,n-1),ans:n*A(n-1,n-1)*sum;sum为常数;
由于A(n-1,n-1)从第三项开始就是偶数,由于ans:ans%2--->{n>3,ans=0}
*/

#include<bits/stdc++.h>
#define  ll long long
using namespace std;
int main (){
	int t;cin>>t;
	while(t--){
		ll n;cin>>n;
		if(n<=2) printf("1\n");
		else printf("0\n");
	}
	return 0;
}
/**
J	div.2 A
链接:https://ac.nowcoder.com/acm/contest/275/J

题意:f(n,k) n拆分为k个有序正整数乘积的方案数;
ans = segment( (f(i,k)+i))%mod) i-->[1,n];

分析:f(n,k)=C(num_p1+k-1,k-1)*C(num_p2+k-1,k-1)*.....C(num_pcnt+k-1,k-1)......
num_pi:n不同质因子的数量;
f(n,k):可考虑经典球盒问题,将长度为k的盒子初始化,均赋值为1,将质因子做为球丢进即可;

ans:显然当前这题是需要趋近于O(n)的方法来实现的,不妨想到欧拉筛选素数;
在筛选过程,每个数可用num[i],记录i在当前情况下,未用的最小质因子的数量,由此进行递推即可;
每次i%prime[j]==0,也就是当前的i已经被最小的已经用过的质因子使用过了;
但是可能还存在,对于当前过程,只增加1,递推可得当前ans;
对于新的质因子表示:用过的质因子的个数已经全部被取完了,*k即可;

如果采用普通的素数筛选方法,貌似会炸空间 且时间复杂度不会得到保证;

*/

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int maxn=1e7+7;
const int mod=1e9+7;
int prime[maxn],ans[maxn],num[maxn],cnt=0;

const int inv_num=1e2+7;
int inv[inv_num+3];

int main (){
	ll k;int n;cin>>n>>k;k%=mod;
	inv[1]=1,ans[1]=1;
	for(int i=2;i<=100;i++) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;//质因子数量最多为64:
	for(int i=2;i<=n;i++){
		if(!prime[i]){
			prime[++cnt]=i;
			ans[i]=k,num[i]=1;//素数:
		}
		for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
			prime[i*prime[j]]=1;
			if(i%prime[j]==0){
				ans[i*prime[j]]=1ll*ans[i]*(num[i]+k)%mod*inv[num[i]+1]%mod;//C(num[i]+k-1,k-1)-->C(num[i]+k-1+1,k-1);
				num[i*prime[j]]=num[i]+1;//引进旧因子;
				break;
			}
			ans[i*prime[j]]=1ll*ans[i]*k%mod;
			num[i*prime[j]]=1;//新查询的因子
		}
	}
	int ret=0;
	for(int i=1;i<=n;i++) ret^=(ans[i]+i)%mod;
	printf("%d\n",ret);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/hypHuangYanPing/article/details/84197201