PAROVI(ZJNU 1830)
题目大意
对于到的数字,我们称二元组为质数对当且仅当。现在你要取若干组质数对使得,都不满足和,问有多少种质数对的取法。
思路
由于直接做有点抽象,于是我们考虑容斥。首先我们可以求出所有区间的质数对的个数,然后用状压枚举出满足条件的,对于这样的几个,我们能算出使它们满足条件的方案数,最后再利用一下容斥的性质,就能轻松惹~
代码
#include<bits/stdc++.h> using namespace std; long long mod=1e9; int sum[25][25]; int gcd(int a,int b){return b?gcd(b,a%b):a;} long long poww(long long a,long long n) { long long ans=1; while(n) { if(n&1)ans=ans*a%mod; a=a*a%mod;n>>=1; } return ans; } int main() { int n; scanf("%d",&n); if(n==1) { printf("0\n"); return 0; } for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) for(int k=i;k<=j;k++) for(int l=k+1;l<=j;l++) if(gcd(k,l)==1)sum[i][j]++; long long ans=0; vector<int>v; for(int i=0;i<(1<<(n-1));i++) { v.clear(); int cnt=0; int anss=0; v.push_back(1); for(int j=0;j<n-1;j++) { if((1<<j)&i) { v.push_back(j+2); cnt++; } } for(int j=1;j<(int)v.size();j++) anss+=sum[v[j-1]][v[j]-1]; anss+=sum[v[cnt]][n]; if(cnt&1)ans=(ans-poww(2,anss)+1+mod)%mod; else ans=(ans+poww(2,anss)-1+mod)%mod; } printf("%lld\n",ans); return 0; }
__EOF__

本文作者:Jerry-Black
本文链接:https://www.cnblogs.com/Jerry-Black/p/16455888.html
关于博主:小蒟蒻一只( ̄^ ̄)ゞ
版权声明:转载请注明来源哟~ QAQ
声援博主:UP UP UP !!!
本文链接:https://www.cnblogs.com/Jerry-Black/p/16455888.html
关于博主:小蒟蒻一只( ̄^ ̄)ゞ
版权声明:转载请注明来源哟~ QAQ
声援博主:UP UP UP !!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)