9 条题解
-
1
Cardinal (我既是正义) LV 9 @ 7 年前
反演裸题,乱搞就行了。
-
17 年前@
-
06 年前@
注意计算出来的中间结果的类型,否则最后一个测试点会溢出。
-
08 年前@
-
0
-
09 年前@
测试数据 #0: Accepted, time = 15 ms, mem = 1296 KiB, score = 10
测试数据 #1: Accepted, time = 15 ms, mem = 1292 KiB, score = 10
测试数据 #2: Accepted, time = 0 ms, mem = 1292 KiB, score = 10
测试数据 #3: Accepted, time = 0 ms, mem = 1296 KiB, score = 10
测试数据 #4: Accepted, time = 0 ms, mem = 1292 KiB, score = 10
测试数据 #5: Accepted, time = 1 ms, mem = 1292 KiB, score = 10
测试数据 #6: Accepted, time = 0 ms, mem = 1292 KiB, score = 10
测试数据 #7: Accepted, time = 15 ms, mem = 1296 KiB, score = 10
测试数据 #8: Accepted, time = 15 ms, mem = 1296 KiB, score = 10
测试数据 #9: Accepted, time = 18 ms, mem = 1292 KiB, score = 10
Accepted, time = 79 ms, mem = 1296 KiB, score = 100
代码
#include <iostream>
#include <stdio.h>using namespace std;
inline long long min( long long a , long long b )
{
if( a > b )
return b;
return a;
}long long f[100000 + 2];
long long n , m;
long long ans;
long long i , j;int main()
{
scanf( "%d %d" , &n , &m );
for( i = min( n , m ) ; i >= 1 ; i-- )
{
f[i] = ( n / i ) * ( m / i );
for( j = 2 * i ; j <= min( n , m ) ; j += i )
f[i] -= f[j];
}
for( i = min( n , m ) ; i >= 1 ; i-- )
ans += f[i] * ( 2 * i - 1 );
cout << ans << endl;
return 0;
}
水题 -
010 年前@
#include <cstdio>
#include <algorithm>
#include <cstring>using namespace std ;
#define ll long long
#define Sum( l , r ) ( sum[ r ] - sum[ l - 1 ] )
#define maxn 100100bool f[ maxn ] ;
int u[ maxn ] , n , m , sum[ maxn ] ;
ll ans = 0 ;void Init( ) {
memset( f , true , sizeof( f ) ) ;
f[ 0 ] = f[ 1 ] = false , u[ 1 ] = 1 ;
for ( int i = 1 ; i ++ < min( n , m ) ; ) if ( f[ i ] ) {
u[ i ] = - 1 ;
for ( int j = i << 1 ; j <= min( n , m ) ; j += i ) {
f[ j ] = false ;
if ( ! ( ( j / i ) % i ) ) u[ j ] = 0 ; else u[ j ] = u[ j / i ] * - 1 ;
}
}
sum[ 0 ] = 0 ;
for ( int i = 0 ; i ++ < min( n , m ) ; ) sum[ i ] = sum[ i - 1 ] + u[ i ] ;
}ll query( int a , int b ) {
ll ret = 0 ;
for ( int i = 1 ; i <= min( a , b ) ; ) {
int pos = min( a / ( a / i ) , b / ( b / i ) ) ;
ret += ( ll )( Sum( i , pos ) ) * ( ll )( a / i ) * ( ll )( b / i ) ;
i = pos + 1 ;
}
return ret ;
}int main( ) {
scanf( "%d%d" , &n , &m ) ;
Init( ) ;
for ( int i = 0 ; i ++ < min( n , m ) ; ) {
ans += ( ll )( i ) * query( n / i , m / i ) * 2 ;
}
ans -= ( ll )( n ) * ( ll )( m ) ;
printf( "%lld\n" , ans ) ;
return 0 ;
} -
-110 年前@
80分很开心了~~~~~~
直接二维n,m然后gcd(n,m),此次能量损失为sqr(gcd(n,m)),并且把斜率记入(相当于已经算了这条线上所有的损失了) -
-111 年前@
最简单朴素竟然能得80分!
- 1