题目链接:
HDU 6051
题意:
给你一个非负数
题解:
数学题。
令
那么有
令
因为
所以我们最后只需要求
其中
而另一部分
然后根据公式
其中,
AC代码:
#include<bits/stdc++.h>
const int mod = 1e9+7;
using namespace std;
typedef long long ll;
int mod_mul(int a,int b)
{
ll c = 1LL * a * b;
return c - c / mod * mod;
}
int euler(int n)
{
int ret = n;
int i;
for(i = 2 ; i * i <= n ; i ++)
{
if(n % i == 0)
{
ret = ret - ret / i;
while(n % i == 0)
{
n /= i;
}
}
}
if(n > 1)
{
ret = ret - ret / n;
}
return ret;
}
int solve(int n)
{
int ans = 0;
int tmp = 0;
for(int i = 1 , j ; i * i <= n; i++)
{
j = n / i;
if(i * j == n)
{
tmp = mod_mul( (1LL * j * euler(j) + ( j == 1 ) ) / 2 % mod, mod_mul( i , i ) );
if((ans += tmp) >= mod) ans -= mod;
if(i != j)
{
tmp = mod_mul( (1LL * i * euler(i) + ( i == 1 ) ) / 2 % mod, mod_mul( j , j ) );
if((ans += tmp) >= mod) ans -= mod;
}
}
}
ans -= mod_mul( mod_mul( n, n + 1), 500000004);
if(ans < 0) ans += mod;
return ans;
}
int main()
{
int t;
int m,p,cas=0;
scanf("%d",&t);
while(t--)
{
cas++;
scanf("%d%d",&m,&p);
int ans = mod_mul( solve(p - 1), m );
printf("Case #%d: ",cas);
printf("%d\n",ans);
}
return 0;
}
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。