Gym - 101981G
首先用坐标打表找出规律,发现表达式应该是一个四次方程
根据打表结果解出方程系数
最后注意取模求逆元
关于取模求逆元:https://www.cnblogs.com/shawn-ji/p/5674772.html
下面上代码(包括打表)
#include <bits/stdc++.h>
using namespace std;
#define les 0.0000001
#define mod 1000000007
struct node {
double x,y;
}p[100005];
int cnt;
inline double dis(int a,int b) {
return (p[a].x-p[b].x)*(p[a].x-p[b].x)+(p[a].y-p[b].y)*(p[a].y-p[b].y);
}
bool same(int a,int b,int c) {
if(abs(dis(a,b)-dis(b,c))<les)
if(abs(dis(a,b)-dis(a,c))<les)
return true;
return false;
}
int solve(int n) {
cnt=0;
double start=0,y=0;
for(int i=0;i<n+1;i++) {
for(int j=0;j<n+1-i;j++) {
p[cnt].y=y;
p[cnt++].x=double(start+j);
}
start+=0.5;
y+=sqrt(3)/2.0;
}
int ans=0;
for(int i=0;i<cnt;i++) {
for(int j=i+1;j<cnt;j++) {
for(int k=j+1;k<cnt;k++) {
if(same(i,j,k)) {
ans++;
}
}
}
}
return ans;
}
long long n;
long long fpow(long long a,long long p) {
long long base=a%mod;
long long ans=1;
while(p) {
if(p&1)
ans=ans*base%mod;
base=base*base%mod;
p=p>>1;
}
return ans%mod;
}
long long ivt(){ return fpow(24,mod-2);}
int main() {
int t; scanf("%d",&t);
while(t--) {
scanf("%lld",&n);
long long ans=(fpow(n,4)+fpow(n,3)*6+fpow(n,2)*11+n%mod*6)%mod;
//ans/=24;
//ans*ivt()%mod;
ans=ans*41666667%mod;
printf("%lld\n",ans);
}
}