codevs月賽第三場4245 Cww的作業

題目描述 Description
師傅給cww佈置了道題,cww看到題目就不想寫,請你幫忙了:
設n爲正整數,令f(n)爲所有gcd(x,y)的最大值,且x和y滿足1<=x<y<=n ,其中gcd指最大公約數。
舉個例子:當n=3時,x,y可以取1,2或1,3或2,3,gcd(x,y)的最大值爲1,因此f(3)=1。
給定正整數m,求當2<=i<=2m+1時,所有f(i)的平方和。
輸入描述 Input Description
僅一行,一個正整數m。
輸出描述 Output Description
僅一行,所求結果對10007取模的結果。
樣例輸入 Sample Input
SAMPLE #1:
3
SAMPLE #2:
10
樣例輸出 Sample Output
SAMPLE #1:
28
SAMPLE #2:
770
數據範圍及提示 Data Size & Hint
10% : n ≤ 10.
20% : n ≤ 100.
40% : n ≤ 1000.
60% : n ≤ 10000.
80% : n ≤ 1000000.
100% : n ≤ 10^9.

一道喪心病狂的codevs月賽數學題。先來看f(x),容易知道f(x)=x/2 (x嚴格小於y保證其最大公約數不超過最大值的一半)。那麼:
i=22m+1f(x)2=12+12+22+22+...+m2+m2=2(12+22+32+...+m2)=2m(m+1)(2m+1)6=m(m+1)(2m+1)3

#include<cstdio>
using namespace std;
long long n,ans=1;
int main()
{
    scanf("%lld",&n);
    if (n%3==0) ans=(ans*n/3)%10007; else ans=(ans*n)%10007;
    if ((n+1)%3==0) ans=(ans*((n+1)/3)%10007)%10007; else ans=(ans*((n+1))%10007)%10007;
    if ((2*n+1)%3==0) ans=(ans*((2*n+1)/3)%10007)%10007; else ans=(ans*((2*n+1))%10007)%10007;
    printf("%lld",ans);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章