版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wuxiaowu547/article/details/81913755
【1】圆上有n个点,两两相连,问有多少个区域;
首先在圆上去n个点,要是n个点产生的区域数最大,就必须是任意3条直线不交于一点。也就是圆内任意一点最多只有两条直线经过。在圆上的n个点会连出C(n,2)条直线。任意一个圆内交点都可以有圆上四点构成的四元组唯一对应,那么无序四元组的个数为C(n,4),也是交点个数。
如果把圆看成一张图(圆弧也是边),点数有n+C(n,4),边数有C(n,2)+2C(n,4)+n;
根据欧拉公式有F=E-V+2=C(n,4)+C(n,2)+2,扣掉圆外区域,答案为C(n,4)+C(n,2)+1。
代码:
#include <bits/stdc++.h>
using namespace std;
long long Mod = 1e9 + 7;
long long int QPow(long long int a,long long int x){
if(x == 0){return 1;}
if(x == 1){return a;}
long long int ans = QPow(a,x / 2);
if(x % 2 == 0){return ans * ans % Mod;}
return ans * ans % Mod * a % Mod;
}
int main(){
int T,k = 1;
scanf("%d",&T);
while(T --){
long long N;
scanf("%lld",&N);
if(N <= 2){printf("Case #%d: %lld\n",k,N);k ++;continue;}
long long a = N % Mod;
long long b = (N - 1) % Mod;
long long c = (N - 2) % Mod;
long long d = (N - 3) % Mod;
long long t1 = a * b % Mod * c % Mod * d % Mod;
long long t2 = QPow(24,Mod - 2);
long long ans = t1 * t2 % Mod;
long long t3 = a * b % Mod;
long long t4 = QPow(2,Mod - 2);
ans = ans + (t3 * t4 % Mod);
ans %= Mod;
ans += 1;
ans = (ans + Mod) % Mod;
printf("Case #%d: %lld\n",k,ans);
k ++;
}
return 0;
}
【2】给出一个正多边形,求每两个顶点相连的区域个数;
oeis的公式;
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1000000007;
ll ma;
ll pow(ll n,int m)
{
ll ans=1;
while(m)
{
if(m&1)
{
ans=(ans*n)%mod;
}
m>>=1;
n=(n*n)%mod;
}
return ans%mod;
}
ll pan(ll n)
{
ll ans=(((pow(n,4)-6*pow(n,3)%mod+mod)%mod)+(23*pow(n,2)-42*n%mod+mod)%mod+24)%mod;
return (ans*ma)%mod;
}
int main()
{
ll n;
ma=pow((ll)24,mod-2);
while(~scanf("%lld",&n))
{
printf("%lld\n",pan(n));
}
}